Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么OrderedDict是用驼峰大小写命名的,而defaultdict是小写的?_Python - Fatal编程技术网

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等)