Ответ 1
Вы можете подклассом dict
и реализовать __missing__
:
class missingdict(dict):
def __missing__(self, key):
return 'default' # note, does *not* set self[key]
Демо:
>>> d = missingdict()
>>> d['foo']
'default'
>>> d
{}
Вы также можете подклассифицировать defaultdict
, вы получите factory обработку плюс поддержку копирования и рассола, брошенную в:
from collections import defaultdict
class missingdict(defaultdict):
def __missing__(self, key):
return self.default_factory()
Демо:
>>> from collections import defaultdict
>>> class missingdict(defaultdict):
... def __missing__(self, key):
... return self.default_factory()
...
>>> d = missingdict(list)
>>> d['foo']
[]
>>> d
defaultdict(<type 'list'>, {})
но, как вы можете видеть, __repr__
не относится к его имени.