【问题标题】:Why is OrderedDict named in camel case while defaultdict is lower case?为什么 OrderedDict 以驼峰式命名,而 defaultdict 为小写?
【发布时间】:2017-09-22 22:05:27
【问题描述】:

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

谁能提供更好的解释?我希望更好的理由。

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

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

【问题讨论】:

  • “既然类和类型应该是统一的,那么 Python 类的 CamelCase 和 C 类型的小写之间的区别令人沮丧地尴尬。” - user2357112,来自标记副本中的评论。
  • 解决您的“这正在改变”的观点:这不是 python 3 执行 c 实现的方式。例如 py3,您执行 import pickle 并委托给 import _pickle - c 实现 - 如果可用。
  • 谢谢,@roippi,我指的是 bugs.python.org/issue16991> 中的补丁,它们被称为 cOrderedDict。 C 和 Python 版本都将通过相同的名称导入这一事实无关紧要。 defaultdictOrderedDict 的命名约定仍然不匹配。

标签: python


【解决方案1】:

根据我在 python-dev 档案中可以找到的内容,这只是开发人员没有遵循自己的指导方针的一个案例。

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

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

注意NamedDict是一个错字,he meant DefaultDict

> 我想你的意思是“DefaultDict”。

是的,我分心了。 :-(

我不确定为什么从未进行过此更改(以及其他模块的类似更改,例如 socket.socketdatetime.datetime),因为 Guido 支持这样做。

具有讽刺意味的是,it was Guido(或者可能是 Alex Martelli)提出了 defaultdict 这个名字,尽管事实上他们是基于 Google 使用的名为 DefaultDict 的内部类:

Google 有一个名为 DefaultDict 的内部数据类型,它获取 在构造时传递了一个默认值。它的__getitem__ 方法, 而不是提高KeyError,插入给定的浅拷贝(!) 未找到值时将默认值放入字典中。

...剪辑...

在与 Alex Martelli 共进午餐时,他提出 dict 的一个子类 具有这种行为(但在 C 中实现)将是一个很好的补充 语言。看起来实施起来并不难。 可以 是一个名为 defaultdict 的内置函数。第一个,必需的,论据 构造函数应该是默认值。剩下的论点(甚至 关键字 args) 原封不动地传递给 dict 构造函数。

讨论很快从defaultdict 成为内置模块转移到它成为collections 模块的一部分,但全小写的名称仍然存在。这个讨论发生在 2006 年,所以到那时 PEP 8 已经存在很多年了。不知道为什么当时没有人想到它应该被命名为DefaultDict

【讨论】:

  • 我很确定 Google 内部类型是用 Python 实现的,所以它会使用 Python 命名约定。
  • @user2357112 在讨论OrderedDict 的同一个线程中,Guido said this 回应了类似的建议(在 C 中实现的类应该全部小写):“然后他们'都错了。在 3.0 中,我们正在远离这一点,例如 cPickle 消失了,cStringIO 也消失了。实现语言不应该闪耀。*也许*“内置状态”应该引导大小写,因此只有内置类型是小写的(str、int、dict 等)。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多