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 にはenterがあり、exitメソッドは

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 Way のほぼすべての側面に違反しており、Perl のようなコンテキスト過敏な言語でさえ、特に意図しない限り、呼び出し元の環境を内省することは通常避けています。非常に多くの非標準のインタープリターのハックが必要になります。

それはさておき、「ループで実行される」ことは、実際に関数の基にしたいものではないと思います。あなたの説明から、元に戻す状態に関する限り、複数ステップの操作を単一の操作と見なす必要があります。これは、操作が必要な完全に論理的な理由であり、ユーザーには単一の変更のように見えることに基づいています。時々節約し、他の時には節約しないようにします。ただし、ループ中 (アプリはおそらくメイン ループで実行されるため) または for ループ中 (一部のアルゴリズムは while ループを要求するため、それらの追跡を無効にする必要があるため) で元に戻す履歴を無効にすることによって完全にカバーされるわけではありません)。また、ユーザーにとって、同じ値に影響を与える 2 つの異なる関数を呼び出す場合はどうでしょうか。単一の操作のように見えますか? その値への変更を 1 つだけ保存する必要があります。

したがって、あなたが本当に望むのは、状態を変更する各ユーザー入力の後に状態を保存し、デフォルトで元に戻さない動作にすることだと思います。

于 2015-11-25T05:55:46.113 に答える