WeakValueDictionary setdefault而不创建将不使用的默认值

问题描述 投票:0回答:1

我正在将WeakValueDictionarysetdefault结合使用,并且我希望能够not创建默认的事物的实例

import weakref
my_dict = weakref.WeakValueDictionary()

# ...

# Will create an instance of MyBigFancyClass even if it's not used 
value = my_dict.setdefault('my-key', default=MyBigFancyClass())

在不使用MyBigFancyClass的情况下,如何避免创建它?

python weak-references
1个回答
1
投票

您可以使用setdefault块来代替try/except,或者我个人更喜欢直接覆盖__getitem__

import weakref

class MyBigFancyClass:
    pass

class MyWeakValueDictionary(weakref.WeakValueDictionary):
    def __getitem__(self, item):
        try:
            return super().__getitem__(item)
        except KeyError:
            value = self[item] = MyBigFancyClass()
            return value

my_dict = MyWeakValueDictionary()
value = my_dict['my-key']

0
投票

您可以避免使用setdefault,并使用KeyError自行滚动>

import weakref
my_dict = weakref.WeakValueDictionary()

# ...

try:
    value = my_dict['my-key']
except KeyError:
    value = MyBigFancyClass()
    my_dict['my-key'] = value
© www.soinside.com 2019 - 2024. All rights reserved.