defaultdict可以接受取决于给定缺失密钥的callables吗?

Vim*_*Vim 4 python dictionary python-3.x defaultdict

在给出的例子的文档都似乎是情况下,在第一个调用的参数defaultdict是"常量"功能,如int,list或者lambda: const等我不知道,如果defaultdict只是应该采取恒定的功能作为其callabe的说法,但如果没有,我希望callable依赖于我给出的缺失键值.例如

toy = collections.defaultdict(lambda x: len(x), {'foo': 3})
toy['barr']
Run Code Online (Sandbox Code Playgroud)

我期望的是每当我给出一个缺少的键字符串时,例如'barr',容器可以创建一个新的条目,'barr'其中键是键,其长度4是值.但它不起作用.相反,它给我以下错误:

TypeError: <lambda>() missing 1 required positional argument: 'x'
Run Code Online (Sandbox Code Playgroud)

我希望'barr'lambda这里有这个论点,但显然不是这样.那可能出了什么问题?

zon*_*ndo 7

默认工厂永远不会给出任何参数,所以你不能这样做.但是,您可以做的是子类defaultdict并定义__missing__方法:

class CustomDefaultDict(collections.defaultdict):
    def __missing__(self, key):
        self[key] = value = len(key)
        return value
Run Code Online (Sandbox Code Playgroud)

为了使它更容易扩展,你也可以利用default_factory它,但给它作为一个参数的关键:

class CustomDefaultDict(collections.defaultdict):
    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError((key,))
        self[key] = value = self.default_factory(key)
        return value
Run Code Online (Sandbox Code Playgroud)