defaultdict 可以接受依赖于给定缺失键的可调用项吗?
Can defaultdict accept callables dependent on the given missing key?
the docs中给出的示例似乎都是defaultdict
中第一个可调用参数是"constant"函数的情况,如int
、list
,或 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
根本无法按照您尝试使用它的方式工作。
the docs中给出的示例似乎都是defaultdict
中第一个可调用参数是"constant"函数的情况,如int
、list
,或 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
根本无法按照您尝试使用它的方式工作。