为什么Python dicts不统一?

时间:2011-07-06 20:52:23

标签: python

阅读this question后,我注意到S. Lott可能喜欢使用“有序的defaultdict”,但它不存在。现在,我想知道:为什么我们在Python中有这么多的dict类?

  • 字典
  • blist.sorteddict
  • collections.OrderedDict
  • collections.defaultdict
  • weakref.WeakKeyDictionary
  • weakref.WeakValueDictionary
  • 他人?

为什么不这样,

dict(initializer=[], sorted=False, ordered=False, default=None, 
     weak_keys=False, weak_values=False)

统一一切,并提供一切有用的组合?

4 个答案:

答案 0 :(得分:12)

一个问题是,由于现在存在这种类型的构造函数,进行此更改会破坏向后兼容性:

>>> dict(one=1, two=2)
{'two': 2, 'one': 1}

答案 1 :(得分:8)

这些额外的选项不是免费的。由于99.9%的Python构建在dict之上,因此非常非常重要,以使其尽可能最小和最快。

答案 2 :(得分:4)

因为实施方式有很大差异。你基本上会得到一个dict工厂,它返回一个_dict的实例(一个非常快速,低开销的字典 - 当前dict),ordereddictdefaultdict,...类。此外,您无法再使用关键字参数初始化字典;依赖于此的程序将失败:

>>> dict(sorted=42)
{'sorted': 42}
# Your proposal would lead to an empty dictionary here (breaking compatibility)

此外,当它合理时,各种类已经相互继承:

>>> collections.defaultdict.__bases__
(<type 'dict'>,)

答案 3 :(得分:0)

这就是为什么语言有“mixins”。

你可以通过定义正确的一堆类来尝试发明类似的东西。

class defaultdict( dict, unordered, default_init ): pass
class OrderedDict( dict, ordered, nodefault_init ): pass
class WeakKeyDict( dict, ordered, nodefault_init, weakkey ): pass
class KeyValueDict( dict, ordered, nodefault_init, weakvalue ): pass

然后,一旦你有了这些“统一”的词典,你的应用程序就像这样

groups= defaultdict( list )

该应用没有真正的变化,是吗?