the docs中给出的示例似乎都是defaultdict
中第一个可调用参数是“常量”函数的情况,如int
,list
或lambda: 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
的论点,但显然并非如此。那可能出了什么问题?
答案 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
根本不会像您尝试使用它一样工作。