我花了一些时间调查collections.namedtuple module https://hg.python.org/cpython/file/3b920a778484/Lib/collections/__init__.py#l265几周前。该模块使用一个工厂函数来填充动态数据(新的名称)namedtuple
类,以及类属性名称)转换成一个非常大的字符串。然后exec
以字符串(代表代码)作为参数执行,并返回新类。
有谁知道为什么这样做,当有一个特定的工具可以随时使用这种东西时,即元类?我自己没有尝试过这样做,但似乎发生在namedtuple
模块可以很容易地使用namedtuple
元类,就像这样:
class namedtuple(type):
etc etc.
编辑:谦虚地建议阅读几年后我写的答案 https://stackoverflow.com/a/56633245/2437514,位于页面下方一点。
里面有一些提示问题 3974 http://bugs.python.org/issue3974。作者提出了一种创建命名元组的新方法,但被拒绝,评论如下:
看来原版的好处是速度更快,
感谢硬编码关键方法。——安托万·皮特鲁
使用 exec 并没有什么不妥之处。早期版本使用其他
方法,但事实证明它们不必要地复杂并且具有意想不到的效果
问题。命名元组的一个关键特征是它们完全是
相当于手写课。——雷蒙德·赫廷格
另外,这里是描述的一部分原本的namedtuple recipe http://code.activestate.com/recipes/500261-named-tuples/:
...配方已经发展到目前的执行风格,我们得到了所有
免费使用 Python 的高速内置参数检查。新的
构建和执行模板的风格使得 __new__ 和
__repr__ 比本配方之前的版本运行得更快、更干净。
如果您正在寻找一些替代实现:
抽象基类+命名元组的混合 http://code.activestate.com/recipes/577629-namedtupleabc-abstract-base-class-mix-in-for-named/食谱由 Jan Kaliszewski 设计
基于元类的实现 https://gist.github.com/aliles/1160525作者:Aaron Iles(参见他的博客文章 http://aliles.tumblr.com/post/9205886103/replacing-exec-with-metaclass-for-namedtuple)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)