defaultdict 可以接受依赖于给定缺失键的可调用项吗?

Can defaultdict accept callables dependent on the given missing key?

the docs中给出的示例似乎都是defaultdict中第一个可调用参数是"constant"函数的情况,如intlist,或 lambda: const 等。我不知道 defaultdict 是否应该将常量函数作为其 callabe 参数,但如果不是,我希望可调用对象依赖于缺少的键值我给。例如

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

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

TypeError: <lambda>() missing 1 required positional argument: 'x'

我原以为'barr'是这个lambda的论点,但显然不是这样。那么可能出了什么问题?

默认工厂从不提供任何参数,所以你不能那样做。但是,您可以做的是子类 defaultdict 并定义 __missing__ 方法:

class CustomDefaultDict(collections.defaultdict):
    def __missing__(self, key):
        self[key] = value = len(key)
        return value

为了使其更易于扩展,您还可以利用 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

来自文档:


如果default_factory不是None,则调用不带参数为给定键提供一个默认值,这个值被插入到键的字典,并返回。


defaultdict 根本无法按照您尝试使用它的方式工作。