我如何在 python 中创建一个 dead weakref?
How can I create a dead weakref in python?
有没有比以下更好的方法:
def create_expired_weakref():
class Tmp: pass
ref = weakref.ref(Tmp())
assert ref() is None
return ref
上下文:我想要我的 weakref 的默认状态,以便我的 class 可以做:
def __init__(self):
self._ref = create_expired_weakref()
def get_thing(self):
r = self._ref() # I need an empty weakref for this to work the first time
if r is None:
r = SomethingExpensive()
self._ref = weakref.ref(r)
return r
用你一个 weakref.finalize
非常好:
import weakref
def create_expired_weakref(type_=type("", (object,), {'__slots__':
('__weakref__',)})):
obj = type_()
ref = weakref.ref(obj)
collected = False
def on_collect():
nonlocal collected
collected = True
final = weakref.finalize(obj, on_collect)
del obj
while not collected:
pass
return ref
如果你正在调试,这可能会阻塞线程一段时间,甚至可能在一些模糊的情况下死锁,但它保证 return 一个过期的 weakref。
另一种方法是在此处使用鸭子类型。如果你只关心它在 self._ref()
调用方面表现得像一个死的 weakref,那么你可以做
self._ref = lambda : None
当我有一个类似的愿望时,我最终使用了这个 属性,如果它可用,它将 return 缓存值,否则 None。我用这个 lambda 函数初始化了它。然后 属性 是
@property
def ref(self):
return self._ref()
更新:归功于@Aran-Fey,我看到他将这个想法发布为对问题的评论,而不是作为答案。
有没有比以下更好的方法:
def create_expired_weakref():
class Tmp: pass
ref = weakref.ref(Tmp())
assert ref() is None
return ref
上下文:我想要我的 weakref 的默认状态,以便我的 class 可以做:
def __init__(self):
self._ref = create_expired_weakref()
def get_thing(self):
r = self._ref() # I need an empty weakref for this to work the first time
if r is None:
r = SomethingExpensive()
self._ref = weakref.ref(r)
return r
用你一个 weakref.finalize
非常好:
import weakref
def create_expired_weakref(type_=type("", (object,), {'__slots__':
('__weakref__',)})):
obj = type_()
ref = weakref.ref(obj)
collected = False
def on_collect():
nonlocal collected
collected = True
final = weakref.finalize(obj, on_collect)
del obj
while not collected:
pass
return ref
如果你正在调试,这可能会阻塞线程一段时间,甚至可能在一些模糊的情况下死锁,但它保证 return 一个过期的 weakref。
另一种方法是在此处使用鸭子类型。如果你只关心它在 self._ref()
调用方面表现得像一个死的 weakref,那么你可以做
self._ref = lambda : None
当我有一个类似的愿望时,我最终使用了这个 属性,如果它可用,它将 return 缓存值,否则 None。我用这个 lambda 函数初始化了它。然后 属性 是
@property
def ref(self):
return self._ref()
更新:归功于@Aran-Fey,我看到他将这个想法发布为对问题的评论,而不是作为答案。