查看source code,似乎唯一的“原因”是OrderedDict
是用Python编写的,而defaultdict
是用C编写的。但它似乎正在改变,因为Python 3.5应该有一个cOrderedDict(见Python Bugs),这突出了我唯一的解释实际上有多糟糕。
有人能提供更好的解释吗?我希望有更好的理由。
修改:
对于Python 2.7,alleged duplicate答案是可以的,而不是对于类3 /类型区别消失的Python 3。 OrderedDict
和defaultdict
都被解释器本身视为类:
>>> collections.defaultdict
<class 'collections.defaultdict'>
>>> collections.OrderedDict
<class 'collections.OrderedDict'>
答案 0 :(得分:17)
基于我在python-dev档案中可以找到的内容,这只是开发人员不遵循他们自己的指导原则的情况。
Guido实际上建议renaming defaultdict
to DefaultDict
在讨论引入OrderedDict
的PEP时解决这种不一致问题:
无论如何,似乎特别是收藏模块已经存在 内部不一致 -
NamedTuple
与defaultdict
。从某种意义上说 defaultdict在这里是奇怪的,因为这些是你导入的东西 从某个模块来看,它们不是内置的。也许它应该重命名为NamedDict
?
请注意,NamedDict
是拼写错误,he meant DefaultDict
:
&GT;我想你的意思是“DefaultDict”。
是的,我被分心了。 : - (
我不确定为什么这个更改(以及其他模块的类似更改,例如socket.socket
,datetime.datetime
)从未进行过,因为Guido支持这样做。
具有讽刺意味的是,it was Guido(或者可能是Alex Martelli)提出了defaultdict
这个名称,尽管事实上它们是基于Google使用的内部类DefaultDict
:
Google有一个名为
DefaultDict
的内部数据类型 在施工时传递了默认值。它的__getitem__
方法, 而不是提高KeyError
,插入给定的浅拷贝(!) 未找到值时,默认值进入dict。...略...
与Alex Martelli共进午餐,他提出了dict的子类 这种行为(但在C中实现)将是一个很好的补充 语言。看起来实施起来并不难。 可以 是一个名为
defaultdict
的内置。第一个必要的论证 构造函数应该是默认值。剩下的论点(甚至 关键字args)不变地传递给dict构造函数。
讨论很快从内置的defaultdict
转移到collections
模块的一部分,但是全小写的名称卡住了。这个讨论发生在2006年,所以PEP 8已经存在多年了。不知道为什么当时任何人都应该将它命名为DefaultDict
。