为什么namedtuple模块不使用元类来创建nt类对象?

Ric*_*ica 20 python metaclass namedtuple python-internals

几周前我花了一些时间调查这个collections.namedtuple模块.该模块使用工厂函数将动态数据(新namedtuple类的名称和类属性名称)填充到一个非常大的字符串中.然后exec使用字符串(表示代码)作为参数执行,并返回新类.

有没有人知道为什么这样做,当有一种特定的工具可供现有的这种东西,即元类?我自己没有尝试过这样做,但似乎namedtuple模块中发生的一切都可以使用namedtuple元类轻松完成,如下所示:

class namedtuple(type):
Run Code Online (Sandbox Code Playgroud)

等等

vau*_*tah 19

问题3974中有一些提示.作者提出了一种创建命名元组的新方法,该方法被拒绝并带有以下注释:

由于对关键方法进行了硬编码,原始版本的好处似乎是速度更快. - Antoine Pitrou

使用exec没有什么不圣洁的.早期版本使用其他方法,并且它们被证明是不必要的复杂并且具有意外问题.它是命名元组的一个关键特性,它们完全等同于手写类. - Raymond Hettinger

另外,这是原始namedtuple配方描述的一部分:

...这个配方已经发展到现在的exec风格,我们可以免费获得所有Python的高速内置参数检查.构建和执行模板的新风格使__new__和__repr__函数比此配方的先前版本更快更干净.

如果您正在寻找一些替代实现:

  • 我从来没有真的买过这个.在我看来,答案是"因为Raymond Hettinger可以使用奇怪的黑客". (14认同)
  • stdlib不是寻找"好代码"的地方 - 特别是随着语言的发展.更新stdlib以遵循新的做法或利用新模块充满了引入新bug的机会,因此很少这样做. (3认同)