为何OrderedDict使用驼峰命名而defaultdict为小写?
从源代码来看,似乎唯一的“原因”是OrderedDict
是用Python写的,而defaultdict
是用C写的。不过,这种情况似乎要改变,因为Python 3.5应该会有一个cOrderedDict(参见Python Bugs),这也说明我之前的解释其实并不好。
有没有人能提供一个更好的解释?我希望确实有更好的理由。
编辑:这个被认为重复的问题的回答适用于Python 2.7,但不适用于Python 3,因为在Python 3中类和类型的区别已经消失。OrderedDict
和defaultdict
在解释器中都被视为类:
>>> collections.defaultdict
<class 'collections.defaultdict'>
>>> collections.OrderedDict
<class 'collections.OrderedDict'>
1 个回答
根据我在python-dev档案中找到的信息,这只是开发者们没有遵循自己规定的一个例子。
Guido实际上建议过 把 defaultdict
改名为 DefaultDict
,以解决在引入 OrderedDict
的讨论中出现的不一致性:
总之,collections模块内部已经存在不一致的情况——
NamedTuple
和defaultdict
。在某种意义上,defaultdict
是个例外,因为这些东西是从某个模块导入的,而不是内置的。也许它应该改名为NamedDict
呢?
注意,NamedDict
是个错别字,他是想说 DefaultDict
:
> 我想你是指 "DefaultDict"。
是的,我分心了。 :-(
我不太明白为什么这个改动(以及其他模块的类似改动,比如 socket.socket
和 datetime.datetime
)从来没有实现,因为Guido是支持这样做的。
具有讽刺意味的是,正是Guido(或者可能是Alex Martelli)想出了 defaultdict
这个名字,尽管他们是基于谷歌内部使用的一个叫 DefaultDict
的类:
谷歌有一个内部数据类型叫
DefaultDict
,在构造时会传入一个默认值。它的__getitem__
方法在找不到值时,不是抛出KeyError
,而是将给定的默认值的浅拷贝插入字典中。...省略...
在和Alex Martelli吃午饭时,他提议说,带有这种行为的字典子类(但用C实现)会是语言的一个不错补充。看起来实现起来也不难。它可以是一个名为
defaultdict
的内置类型。 构造函数的第一个必需参数应该是默认值。其余参数(包括关键字参数)会原封不动地传递给字典构造函数。
讨论很快从 defaultdict
是内置类型转向它是 collections
模块的一部分,但这个全小写的名字却保留下来了。这场讨论发生在2006年,所以PEP 8那时已经存在很多年了。不知道当时为什么没人想到应该把它命名为 DefaultDict
。