我有一个文本编辑程序,可以将游标分发给需要它的程序的其他部分。游标由两部分列表[start, end]
组成,每次插入/删除文本时都需要更新(开始/结束索引向前或向后移动)。
当光标不再使用时,我想停止更新它,因为有很多,而且更新时间很长。不使用,我的意思是请求它的对象不再引用它 - 它不再关心它。 (例如:它有一个关于'bob'一词的所有搜索结果的游标列表,并且对'fred'这个词进行了新的搜索,所以现在用一个新的游标列表替换它的结果列表。 。旧列表及其游标不再使用。)
我可以要求使用游标的任何对象在不再需要时调用.finished()
方法。但是,如果我能够检测到编辑器之外的任何内容不再被引用,那将会更容易。我如何在python中检查这个(我知道垃圾清理维护一个列表,并在不再引用时删除它)?
答案 0 :(得分: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
您可以将所有这些弱参数放入集合中(或使用WeakKeyDictionary
,WeakValueDictionary
或WeakSet
)来跟踪您必须更新的各种游标。
答案 1 :(得分:4)
除了@nneonneo所说的,你应该定期浏览你的光标弱引用列表并剔除None
,否则你将会得到一个不断增长的None
s列表/ p>