+-

我得到了colletions.defaultdict的一些奇怪的行为:
import collections
c1 = collections.defaultdict(str)
c1['new'] # Works!
c2 = collections.defaultdict(default_factory=str)
c2['new'] # Raises KeyError...
为什么会引发c2一个KeyError?
有时我喜欢命名参数,因为我认为它增加了可读性.
首先我想也许python不允许我通过命名它来传递参数并将我的default_factory参数放到kwargs,所以我检查:
def func(first, **kwargs):
print(first)
print(kwargs)
func(first='one', second='two')
这输出:
one
{'second': 'two'}
所以事实并非如此.
最佳答案
defaultdict构造函数的default_factory参数是仅位置的,并且实际上没有名称.如果您尝试按名称传递它,则只是传递一个完全不相关的关键字参数.由于defaultdict构造函数的关键字参数被解释为其初始内容,因此您的dict开始具有单个键“default_factory”,其值为str类型对象.
要了解其工作原理,请想象一下这样的函数:
def func(*args, **kwds):
(default_factory,) = args
for k, v in kwds.items():
print(k, v) # do something with keys and values
如果这个函数的文档是命名位置参数default_factory,那么它可能是对其含义的正确描述,但如果暗示可以将其作为关键字参数传递,则会产生误导.
一些内置函数就是这样,因为在CPython C代码中定义仅位置参数非常容易.使用defaultdict,它是设计上允许字面上任何字符串键用作初始内容的一部分,而没有恰好命名为default_factory的键的例外.
点击查看更多相关文章
转载注明原文:python – 通过将default_factory作为命名参数传递来构造defaultdict - 乐贴网