为什么在camel情况下命名OrderedDict而defaultdict是小写的?

时间:2014-08-31 23:15:25

标签: python

查看source code,似乎唯一的“原因”是OrderedDict是用Python编写的,而defaultdict是用C编写的。但它似乎正在改变,因为Python 3.5应该有一个cOrderedDict(见Python Bugs),这突出了我唯一的解释实际上有多糟糕。

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

修改: 对于Python 2.7,alleged duplicate答案是可以的,而不是对于类3 /类型区别消失的Python 3。 OrderedDictdefaultdict都被解释器本身视为类:

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

1 个答案:

答案 0 :(得分:17)

基于我在python-dev档案中可以找到的内容,这只是开发人员不遵循他们自己的指导原则的情况。

Guido实际上建议renaming defaultdict to DefaultDict在讨论引入OrderedDict的PEP时解决这种不一致问题:

  

无论如何,似乎特别是收藏模块已经存在   内部不一致 - NamedTupledefaultdict。从某种意义上说   defaultdict在这里是奇怪的,因为这些是你导入的东西   从某个模块来看,它们不是内置的。也许它应该重命名为   NamedDict

请注意,NamedDict是拼写错误,he meant DefaultDict

  

&GT;我想你的意思是“DefaultDict”。

     

是的,我被分心了。 : - (

我不确定为什么这个更改(以及其他模块的类似更改,例如socket.socketdatetime.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