为什么OrderedDict被命名为驼峰式,而defaultdict是小写?

30

从查看源代码来看,似乎唯一的“原因”是OrderedDict是用Python编写的,而defaultdict是用C语言编写的。但是随着Python 3.5的推出,这种情况似乎正在改变,因为将会有一个cOrderedDict(请参见Python Bugs),这突显了我的唯一解释是多么糟糕。

有人能提供更好的解释吗?我希望更好的理由。

编辑据称是重复的答案对于Python 2.7来说是可以的,但对于去除类/类型区分的Python 3来说不适用。解释器本身将OrderedDictdefaultdict都视为类:

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

1
现在,由于类和类型应该是统一的,Python类使用驼峰命名法而C语言类型使用小写命名法之间的差异非常尴尬。——来自标记重复评论的user2357112。 - user2864740
针对您提出的“这正在改变”的观点:Python 3 的 C 实现并不是这样的。例如,在 Py3 中,您可以执行 import pickle,这会委托给可用的 C 实现 _pickle 进行导入。 - roippi
感谢@roippi,我指的是http://bugs.python.org/issue16991中被称为cOrderedDict的补丁。C版本和Python版本都将通过相同的名称导入这一事实是无关紧要的。defaultdictOrderedDict的命名约定仍然不匹配。 - Luciano Ramalho
1个回答

28
根据我在python-dev档案中找到的内容,这只是开发人员没有遵循自己的指导方针的情况。
在介绍OrderedDict的PEP讨论期间,Guido实际上建议defaultdict重命名为DefaultDict来解决这个不一致性:
引用:

Anyway, it seems the collections module in particular is already internally inconsistent -- NamedTuple vs. defaultdict. In a sense defaultdict is the odd one out here, since these are things you import from some module, they're not built-in. Maybe it should be renamed to NamedDict?

请注意,NamedDict是一个拼写错误,他的意思是DefaultDict:
引用:

> I suppose you mean "DefaultDict".

Yes, I've been distracted. :-(

我不确定为什么这个更改(以及其他模块的类似更改,例如socket.socketdatetime.datetime)从来没有被实现,因为Guido支持这样做。

具有讽刺意味的是,它是Guido(或者可能是Alex Martelli)提出了defaultdict这个名称,尽管他们是基于Google正在使用的一个内部类DefaultDict

谷歌有一种内部数据类型叫做DefaultDict,在构造时传递一个默认值。当该值未被找到时,它的__getitem__方法会将给定默认值的浅拷贝插入字典中,而不是引发KeyError异常。 ...... 与Alex Martelli共进午餐时,他建议创建一个字典子类(但用C实现)具有此行为,这将成为语言的一个很好的补充。看起来很容易实现。它可以是一个内置的命名为defaultdict。构造函数的第一个必需参数应该是默认值。其余参数(甚至关键字参数)传递给字典构造函数时不变。 讨论很快从defaultdict成为内置对象转移到了它成为collections模块的一部分,但全小写的名称仍然保留。这次讨论发生在2006年,所以PEP 8当时已经存在多年了。不确定为什么当时没有想到将其命名为DefaultDict

我非常确定 Google 内部类型是用 Python 实现的,因此它将使用 Python 命名约定。 - user2357112
8
在讨论 OrderedDict 的同一讨论串中,Guido 发表了这篇文章,对于类名应该使用全小写的类似建议说道:*"那么他们都是错的。在 3.0 版本中,我们正在朝着另一个方向发展,例如 cPickle 已经被删除,cStringIO 也是如此。实现语言不应该显露出来。*也许* “内置状态”应该指导大小写规则,因此只有内置类型是小写的(如 str、int、dict 等)。"* - dano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接