我正在将WeakValueDictionary
与setdefault
结合使用,并且我希望能够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
的情况下,如何避免创建它?
您可以使用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']
您可以避免使用setdefault
,并使用KeyError
自行滚动>
import weakref
my_dict = weakref.WeakValueDictionary()
# ...
try:
value = my_dict['my-key']
except KeyError:
value = MyBigFancyClass()
my_dict['my-key'] = value