0

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

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

现在我想做的是,如果在循环中调用此函数,我希望仅在循环完成后调用它

我的理由

这个方法在许多其他方法中被调用,最重要__setitem__的是看看下面的代码:

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

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

问题

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

我怎样才能做到这一点?

额外信息

这个数据结构是一个字典,有很多记忆功能。

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

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

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

4

2 回答 2

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 有enterexit方法

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 
于 2013-10-13T04:28:04.877 回答
0

好的,首先:让函数检测到它是从循环中调用的有点荒谬。可以对此类信息采取行动的函数几乎违反了 Python 方式的每个方面,即使是像 Perl 这样的上下文超敏感语言通常也会避免自省其调用者的环境,除非特别打算这样做。你需要这么多非标准的解释器技巧。

不过,撇开这一点不谈,我不认为“在循环中运行”是你真正希望函数基于的。根据您的描述,就撤消状态而言,您希望将多步操作视为单个操作,因为它在用户看来是单个更改,这是需要操作的完全合乎逻辑的理由有时保存,有时不保存。但这并没有完全通过在循环期间禁用撤消历史记录(因为您的应用程序可能在主循环中运行)甚至只是在 for 循环期间(某些算法需要一个 while 循环,并且您仍然希望在这些循环中禁用跟踪)来完全涵盖。另外,如果调用两个不同的函数影响相同的值,那么对于用户来说,似乎是一个单一的操作?您仍然希望只保存对该值的一次更改。

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

于 2015-11-25T05:55:46.113 回答