2

カーソルを必要とするプログラムの他の部分にカーソルを渡すテキスト編集プログラムがあります。カーソルは 2 つの部分のリストで構成され、[start, end]テキストが挿入/削除されるたびに更新する必要があります (開始/終了インデックスは前後に移動します)。

カーソルが多すぎて更新に時間がかかるので、使用しなくなったら更新をやめたい。使用されていないということは、それを要求したオブジェクトがそれを参照しなくなったことを意味します-それはもはや気にしません。(たとえば、「bob」という単語のすべての検索結果へのカーソルのリストがあり、「fred」という単語に対して新しい検索が行われたため、結果リストを新しいカーソルの新しいリストに置き換えます。 . 古いリストとそのカーソルは使用されなくなりました。)

カーソルを使用するオブジェクトは、不要に.finished()なったときにメソッドを呼び出すように要求できます。しかし、エディターの外部から参照されなくなったことを検出できれば、より簡単になります。Pythonでこれを確認するにはどうすればよいですか(ガベージクリーンアップがリストを維持し、参照されなくなったら削除することを知っています)?

4

2 に答える 2

6

モジュールからの弱参照を使用しweakrefて、カーソル参照を保持します。

弱参照の指示対象に強い(通常の)参照がなくなると、weakrefはに解決されNoneます。

>>> import weakref
>>> class Cursor: pass
... 
>>> _ = None # suppress special _ variable
>>> a = Cursor()
>>> r = weakref.ref(a)
>>> print r()
<__main__.Cursor instance at 0x1004a2bd8>
>>> del a
>>> print r()
None

これらすべてのweakrefをコレクションに入れる(または、、、またはを使用WeakKeyDictionaryWeakValueDictionaryWeakSet)と、更新する必要のあるさまざまなカーソルを追跡できます。

于 2012-10-03T01:09:23.087 に答える
4

@nneonneoが言ったことに加えて、カーソルの弱参照のリストを定期的にスキャンして、sを選別する必要があります。そうしないと、 sのNoneリストが増え続けることになります。None

于 2012-10-03T01:12:00.557 に答える