如何在python中创建一个死弱的?

问题描述 投票:4回答:2

有没有更好的方法来做到这一点:

def create_expired_weakref():
    class Tmp: pass
    ref = weakref.ref(Tmp())
    assert ref() is None
    return ref

上下文:我想为weakref设置一个默认状态,以便我的类可以:

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
python weak-references
2个回答
1
投票

另一种方法是在这里使用鸭子打字。如果你关心的是它在self._ref()电话中的行为就像一个死的弱点,那么你可以做

self._ref = lambda : None

这是我最终使用的,当我有一个类似的愿望,如果它可用,将返回缓存值的属性,但否则无。我用这个lambda函数初始化它。然后财产是

@property
def ref(self):
    return self._ref()

更新:归功于@ Aran-Fey,我认为这个想法是对这个问题的评论,而不是答案。


0
投票

使用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

如果你正在调试,这可能会阻塞线程一段时间,甚至可能在一些模糊的情况下死锁,但它保证返回一个过期的weakref。

© www.soinside.com 2019 - 2024. All rights reserved.