WeakValueDictionary setdefault без создания значения по умолчанию, которое не будет использоваться - PullRequest
0 голосов
/ 31 января 2020

Я использую WeakValueDictionary с setdefault, и я хотел бы иметь возможность , а не создать экземпляр того, что по умолчанию

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 в тех случаях, когда он не используется?

Ответы [ 2 ]

1 голос
/ 31 января 2020

Вместо использования 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 голосов
/ 31 января 2020

Вы можете избежать setdefault, и бросить свой собственный, используя KeyError

import weakref
my_dict = weakref.WeakValueDictionary()

# ...

try:
    value = my_dict['my-key']
except KeyError:
    value = MyBigFancyClass()
    my_dict['my-key'] = value
...