python 中的弱引用列表
我需要一个弱引用列表,当它们消失时会删除它们。 目前,我执行此操作的唯一方法是不断刷新列表(手动删除死引用)。
我知道有一个 WeakKeyDictionary 和一个 WeakValueDictionary,但我真的想要一个 WeakList,有办法做到这一点吗?
这是一个例子:
import weakref
class A(object):
def __init__(self):
pass
class B(object):
def __init__(self):
self._references = []
def addReference(self, obj):
self._references.append(weakref.ref(obj))
def flush(self):
toRemove = []
for ref in self._references:
if ref() is None:
toRemove.append(ref)
for item in toRemove:
self._references.remove(item)
b = B()
a1 = A()
b.addReference(a1)
a2 = A()
b.addReference(a2)
del a1
b.flush()
del a2
b.flush()
I'm in need of a list of weak references that deletes items when they die. Currently the only way I have of doing this is to keep flushing the list (removing dead references manually).
I'm aware there's a WeakKeyDictionary and a WeakValueDictionary, but I'm really after a WeakList, is there a way of doing this?
Here's an example:
import weakref
class A(object):
def __init__(self):
pass
class B(object):
def __init__(self):
self._references = []
def addReference(self, obj):
self._references.append(weakref.ref(obj))
def flush(self):
toRemove = []
for ref in self._references:
if ref() is None:
toRemove.append(ref)
for item in toRemove:
self._references.remove(item)
b = B()
a1 = A()
b.addReference(a1)
a2 = A()
b.addReference(a2)
del a1
b.flush()
del a2
b.flush()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以自己实现它,与您的做法类似,但使用在尝试访问项目之前调用
flush()
的列表子类。显然,您不想在每次访问时都执行此操作,但您可以通过在弱引用上设置回调来优化此操作,以在某些内容死亡时将列表标记为脏。 然后,当自上次访问以来某些东西已经死亡时,您只需要刷新列表。
这是使用此方法实现的列表类。 (请注意,它没有经过太多测试,并且某些方法没有非常有效地实现(例如,那些只是转换为真实列表并调用该方法的方法),但这应该是一个合理的起点:
You could implement it yourself, similarly to how you have done, but with a list subclass that calls
flush()
before attempting to access an item.Obviously you don't want to do this on every access, but you can optimize this by setting a callback on the weak reference to mark the list dirty when something dies. Then you only need to flush the list when something has died since the last access.
Here's a list class implemented using this method. (Note that it's not tested much, and some methods aren't implemented very efficiently (eg. those which just convert to a real list and call the method on that), but it should be a reasonable starting point:
您可以使用同一个weakref模块中的
WeakSet
(顺便说一句,它实际上是在其他地方定义的,但它是在那里导入的)。You can use
WeakSet
from the very same weakref module (it's actually defined elsewhere by the way, but it's imported there).因为我需要像你一样的弱引用列表,所以我制作了一个并将其发布在 pypi 上。
现在你可以这样做:
那么:
As I needed a weakref list like you, I've made one and publish it on pypi.
now you can do:
then:
为什么你不能这样做:
然后对
__iadd__
、extend
等做类似的事情。对我有用。
Why can't you just do it like this:
And then do similar for
__iadd__
,extend
etc.Works for me.
您打算如何使用
B
? 我对构建的weakref列表所做的唯一一件事就是迭代它,所以它的实现很简单:How do you plan on using
B
? The only thing I ever do with the weakref list I built is iterate over it, so its implementation is simple:使用传递给weakref的第二个参数的回调函数。
这段代码应该起作用:
Use a callback function passed to second argument of a weakref.
This code should function: