为何OrderedDict使用驼峰命名而defaultdict为小写?

30 投票
1 回答
2109 浏览
提问于 2025-04-19 03:20

源代码来看,似乎唯一的“原因”是OrderedDict是用Python写的,而defaultdict是用C写的。不过,这种情况似乎要改变,因为Python 3.5应该会有一个cOrderedDict(参见Python Bugs),这也说明我之前的解释其实并不好。

有没有人能提供一个更好的解释?我希望确实有更好的理由。

编辑这个被认为重复的问题的回答适用于Python 2.7,但不适用于Python 3,因为在Python 3中类和类型的区别已经消失。OrderedDictdefaultdict在解释器中都被视为类:

>>> collections.defaultdict
<class 'collections.defaultdict'> 
>>> collections.OrderedDict
<class 'collections.OrderedDict'>

1 个回答

28

根据我在python-dev档案中找到的信息,这只是开发者们没有遵循自己规定的一个例子。

Guido实际上建议过 defaultdict 改名为 DefaultDict,以解决在引入 OrderedDict 的讨论中出现的不一致性:

总之,collections模块内部已经存在不一致的情况——NamedTupledefaultdict。在某种意义上,defaultdict 是个例外,因为这些东西是从某个模块导入的,而不是内置的。也许它应该改名为 NamedDict 呢?

注意,NamedDict 是个错别字,他是想说 DefaultDict

> 我想你是指 "DefaultDict"。

是的,我分心了。 :-(

我不太明白为什么这个改动(以及其他模块的类似改动,比如 socket.socketdatetime.datetime)从来没有实现,因为Guido是支持这样做的。

具有讽刺意味的是,正是Guido(或者可能是Alex Martelli)想出了 defaultdict 这个名字,尽管他们是基于谷歌内部使用的一个叫 DefaultDict 的类:

谷歌有一个内部数据类型叫 DefaultDict,在构造时会传入一个默认值。它的 __getitem__ 方法在找不到值时,不是抛出 KeyError,而是将给定的默认值的浅拷贝插入字典中。

...省略...

在和Alex Martelli吃午饭时,他提议说,带有这种行为的字典子类(但用C实现)会是语言的一个不错补充。看起来实现起来也不难。它可以是一个名为 defaultdict 的内置类型。 构造函数的第一个必需参数应该是默认值。其余参数(包括关键字参数)会原封不动地传递给字典构造函数。

讨论很快从 defaultdict 是内置类型转向它是 collections 模块的一部分,但这个全小写的名字却保留下来了。这场讨论发生在2006年,所以PEP 8那时已经存在很多年了。不知道当时为什么没人想到应该把它命名为 DefaultDict

撰写回答