Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何跟踪对象是否仍在';使用';?_Python - Fatal编程技术网

Python:如何跟踪对象是否仍在';使用';?

Python:如何跟踪对象是否仍在';使用';?,python,Python,我有一个文本编辑程序,可以将光标发送给程序中需要它的其他部分。光标由两部分组成,[start,end],每次插入/删除文本时都需要更新该列表(开始/结束索引向前或向后移动) 当光标不再使用时,我想停止更新它,因为有很多光标,而且更新它们很耗时。所谓不使用,我的意思是请求它的对象不再引用它——它不再关心它。(例如:它有一个指向“bob”一词的所有搜索结果的游标列表,并且对“fred”一词进行了新的搜索,因此现在它将其结果列表替换为一个新游标列表…旧列表及其游标不再使用。) 我可以要求任何使用光标的

我有一个文本编辑程序,可以将光标发送给程序中需要它的其他部分。光标由两部分组成,
[start,end]
,每次插入/删除文本时都需要更新该列表(开始/结束索引向前或向后移动)

当光标不再使用时,我想停止更新它,因为有很多光标,而且更新它们很耗时。所谓不使用,我的意思是请求它的对象不再引用它——它不再关心它。(例如:它有一个指向“bob”一词的所有搜索结果的游标列表,并且对“fred”一词进行了新的搜索,因此现在它将其结果列表替换为一个新游标列表…旧列表及其游标不再使用。)

我可以要求任何使用光标的对象在不再需要时调用
.finished()
方法。但如果我能检测到它何时不再被编辑器之外的任何东西引用,那就更容易了。如何在python中检查这一点(我知道垃圾清理会维护一个列表,并在不再引用时将其删除)?

使用
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
>>>类游标:pass
... 
>>>_u=无#抑制特殊u变量
>>>a=光标()
>>>r=weakref.ref(a)
>>>打印r()
>>>德拉
>>>打印r()
没有一个

您可以将所有这些weakref放在一个集合中(或使用
WeakKeyDictionary
WeakValueDictionary
,或
WeakSet
)来跟踪您必须更新的各种游标

除了@nneonneo所说的之外,你应该定期扫描光标弱引用列表,并剔除
None
s,否则你将得到一个不断增长的
None
s

你对“使用”的定义是什么光标?请求它的对象不再引用它-它不再关心它。(例如:它有一个指向“bob”一词的所有搜索结果的游标列表,并且对“fred”一词进行了新的搜索,因此现在它将其结果列表替换为一个新游标列表…旧列表及其游标不再使用。)请注意,
weakref
模块提供了自动丢弃已删除元素的
WeakSet
:)@nneonneo,酷。文档没有提到对象是否需要散列…似乎它们不需要散列元素,因为它是一个
集。好吧,它没有像字典那样改变迭代大小的问题,但不要引用我的话。@nneonneo,您可以将
游标
实例添加到
弱集
,而不会出现任何问题。实现可能只是使用
id()
类实例实际上始终是可散列的,除非覆盖
\uuuueq\uuuuu
,而不是
\uuuuuuuu散列(如果内存可用)