我怎样才能获得一个可调用的工厂用于defaultdict以允许用理解填充它?我认为这可能不可能,但我想不出一个很好的理由呢?
>>> def foo(*args):
... # TODO
...
>>> from collections import defaultdict
>>> thing = foo(defaultdict, int)
>>> d = thing((i, i*i) for i in range(3))
>>> d[2]
# should return 4
>>> d[-1]
# should return 0
解决方法:
default_factory之后对defaultdict的任何参数都被视为与dict的参数一样:
>>> defaultdict(int, [(i, i*i) for i in range(5)])
defaultdict(<type 'int'>, {0: 0, 1: 1, 2: 4, 3: 9, 4: 16})
只需将理解传递给defaultdict并让它完成工作:
def defaultdict_factory_factory(default_factory):
def defaultdict_factory(*args, **kwargs):
return defaultdict(default_factory, *args, **kwargs)
return defaultdict_factory
或者使用functools.partial:
def defaultdict_factory_factory(default_factory):
return partial(defaultdict, default_factory)