Python迭代时禁用

时间:2013-10-13 01:40:03

标签: python loops memory data-structures iteration

所以我正在创建一个基于存储和内存的数据结构。假设我有以下方法:

def __store(self):
    #stores information into self.__memory list

现在我想要做的是,如果在循环中调用此函数,我希望它仅在循环结束后被称为

我的理由

此方法在许多其他方法中被调用,最重要的是__setitem__,因此请查看以下代码:

for i in xrange(100):
    class[i] = i + 5

现在,这将存储信息直到循环结束(100次),但我只希望它在循环结束后存储信息。

问题

基本上我只需要能够在程序中进行迭代时停止运行函数,然后在迭代完成后执行。

我该怎么做?

额外信息

此数据结构是一个具有许多内存函数的字典。

我使用__store存储的全存储内存类型是为了撤消。循环中的任何内容都不需要撤消,因为在循环结束之前,用户不需要撤消任何内容。

此内存基于控件,因此不应存储迭代内的任何内容,因为不需要实际内存。

这就是为什么我不想在迭代期间存储,但是,如果需要存储的东西在迭代中运行,我希望它在内部迭代完成后运行。

2 个答案:

答案 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

编辑1

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循环,并且您仍然希望在这些循环中禁用跟踪)并未完全覆盖)。另外,如果调用影响相同值的两个不同函数,对用户来说,这似乎是一个单独的操作呢?您仍然只想将一个更改保存到该值。

因此,我认为您真正想要的是在每次更改状态的用户输入后保存状态,并默认为撤消 - 不知道行为。