所以我正在创建一个基于存储和内存的数据结构。假设我有以下方法:
def __store(self):
#stores information into self.__memory list
现在我想要做的是,如果在循环中调用此函数,我希望它仅在循环结束后被称为
此方法在许多其他方法中被调用,最重要的是__setitem__
,因此请查看以下代码:
for i in xrange(100):
class[i] = i + 5
现在,这将存储信息直到循环结束(100次),但我只希望它在循环结束后存储信息。
基本上我只需要能够在程序中进行迭代时停止运行函数,然后在迭代完成后执行。
我该怎么做?
此数据结构是一个具有许多内存函数的字典。
我使用__store
存储的全存储内存类型是为了撤消。循环中的任何内容都不需要撤消,因为在循环结束之前,用户不需要撤消任何内容。
此内存基于控件,因此不应存储迭代内的任何内容,因为不需要实际内存。
这就是为什么我不想在迭代期间存储,但是,如果需要存储的东西在迭代中运行,我希望它在内部迭代完成后运行。
答案 0 :(得分:2)
在循环内部函数表现不同是一个坏主意,请尝试使用context manager
。这是一种更好的方法,它更容易理解。
http://www.python.org/dev/peps/pep-0343/
例如:
with sqlite3.connect(":memory:") as conn:
# update will hold in transaction.
for i in xrange(100):
conn.execute("insert ....")
pass
# sqlite3 will commit now
以同样的方式:
with a() as b:
# data won't store
for i in xrange(100):
# don't store data
b[i] = i + 5
pass
# data store while leave context
ContextManager 输入,退出方法
class MemoryManager(object):
def __init__(self):
self.cache = {}
self.buffer = False
def __enter__(self):
self.buffer = True
def __store(self):
# store data
pass
def __setitem__(self, key, value):
self.cache[key] = value
if not self.buffer:
self.__store()
def __exit__(self, exc_type, exc_value, traceback):
self.__store()
self.buffer = False
因此
m = MemoryManager()
with m as b:
# __enter__ got called, set the manager to buffer mode
# data won't store
for i in xrange(100):
# don't store data
m[i] = i + 5 # in with block, so __store won't be called
pass
# __exit__ got called, __store automatically and leave buffer mode
m[0] = 10 # not in buffer mode, __store will be called
答案 1 :(得分:0)
好的,首先:让一个函数检测到它是从循环中调用的,这有点荒谬。可以对这些信息起作用的函数几乎违反了Python方法的各个方面,甚至像Perl这样的上下文过敏语言通常也会避免反省他们的调用者环境,除非特别打算这样做。你需要这么多非标准的翻译黑客。
尽管如此,我并不认为他们会在一个循环中跑步。是你真正想要的功能基于。根据您的描述,您希望将多步操作视为单个操作,只要涉及撤消状态,其基础是用户看起来是单个更改,这是想要操作的完美逻辑原因有时保存而不保存其他时间。但是,在循环期间禁用撤消历史记录(因为您的应用程序可能在主循环中运行)或者甚至只是在for循环期间(某些算法将需要一个while循环,并且您仍然希望在这些循环中禁用跟踪)并未完全覆盖)。另外,如果调用影响相同值的两个不同函数,对用户来说,这似乎是一个单独的操作呢?您仍然只想将一个更改保存到该值。
因此,我认为您真正想要的是在每次更改状态的用户输入后保存状态,并默认为撤消 - 不知道行为。