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

时间:2017-04-07 01:36:45

标签: python python-3.x dictionary defaultdict

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

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

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

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

我希望'barr'成为这个lambda的论点,但显然并非如此。那可能出了什么问题?

2 个答案:

答案 0 :(得分:5)

默认工厂永远不会给出任何参数,所以你不能这样做。但是,您可以做的是子类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

答案 1 :(得分:0)

来自文档:

如果default_factory不是None,则称为不带参数以提供给定键的默认值,此值将插入到键的字典中,然后返回。

defaultdict根本不会像您尝试使用它一样工作。