Python 为什么OrderedDict是用驼峰大小写命名的,而defaultdict是小写的?
看看,唯一的“原因”似乎是Python 为什么OrderedDict是用驼峰大小写命名的,而defaultdict是小写的?,python,Python,看看,唯一的“原因”似乎是orderedict是用Python编写的,而defaultdict是用C编写的。但这似乎正在发生变化,因为Python 3.5应该有一个corderedct(请参阅),这突出了我唯一的解释实际上有多糟糕 有人能提供更好的解释吗?我希望有更好的理由 编辑: 对于Python2.7,答案是肯定的,而对于Python3,类/类型的区别已经消失OrderedDict和defaultdict都被解释器本身视为类: >>> collections.default
orderedict
是用Python编写的,而defaultdict
是用C编写的。但这似乎正在发生变化,因为Python 3.5应该有一个corderedct(请参阅),这突出了我唯一的解释实际上有多糟糕
有人能提供更好的解释吗?我希望有更好的理由
编辑:
对于Python2.7,答案是肯定的,而对于Python3,类/类型的区别已经消失OrderedDict
和defaultdict
都被解释器本身视为类:
>>> collections.defaultdict
<class 'collections.defaultdict'>
>>> collections.OrderedDict
<class 'collections.OrderedDict'>
>collections.defaultdict
>>>收藏,订购
根据我在python开发人员档案中找到的内容,这只是开发人员没有遵循自己的指导原则的一个例子
Guido在讨论引入了OrderedDict的政治公众人物时,实际上建议纠正这种不一致性:
不管怎么说,似乎特别是collections模块已经完成了
内部不一致--NamedTuple
vs.defaultdict
。从某种意义上说
defaultdict在这里很奇怪,因为这些是您导入的东西
从某些模块来看,它们不是内置的。也许应该改名为
namedict
请注意,namedict
是一个打字错误:
>我想你的意思是“默认dict”
是的,我分心了-(
我不知道为什么这个更改(以及其他模块的类似更改,例如socket.socket
,datetime.datetime
)从未进行过,因为Guido支持这样做
具有讽刺意味的是,(或者可能是Alex Martelli),他提出了名字defaultdict
,尽管事实上他们是基于Google使用的内部类defaultdict
:
谷歌有一种称为DefaultDict
的内部数据类型,它
在构造时传递了一个默认值。它的\uuuu getitem\uuu
方法,
插入给定代码的浅层副本(!),而不是引发KeyError
找不到默认值时,将默认值输入dict
…剪断
在与Alex Martelli共进午餐时,他提议使用dict的一个子类
使用此行为(但用C实现)将是对
语言。它看起来不难实现。它可以
是一个名为defaultdict
的内置项
构造函数应为默认值。剩余参数(偶数)
关键字args)会原封不动地传递给dict构造函数
讨论很快从内置的
defaultdict
转移到它是collections
模块的一部分,但全小写的名称仍然存在。这一讨论发生在2006年,因此PEP 8在那时已经存在了很多年。不确定为什么任何人都没有想到它应该被命名为defaultdict
是时候了。“既然类和类型应该是统一的,那么Python类的CamelCase和C类型的小写之间的区别就令人沮丧了。”-user2357112,摘自标记副本中的一条注释。解决您的“这正在改变”要点:这不是Python3实现c的方式。例如py3,你需要导入pickle,这将委托给import\u pickle
——c实现——如果有的话。谢谢,@roippi,我指的是名为corderedect
的补丁。事实上,c和python版本都是通过相同的名称导入是不相关的。defaultdict
和orderedict
的命名约定仍然不匹配。我很确定Google内部类型是用Python实现的,因此它将使用Python命名约定。@user2357112在中讨论orderedict
的同一线程中对类似建议的回应(用C实现的类应该全部用小写字母命名):“那么它们都错了。在3.0中,我们正在远离这一点,例如,cPickle消失了,cStringIO也消失了。实现语言不应该闪耀。*也许*内置状态应指导大写,因此只有内置类型是小写的(str、int、dict等)