【问题标题】:Why Python's namedtuple instance is being created from a string template?为什么 Python 的 namedtuple 实例是从字符串模板创建的?
【发布时间】:2014-03-11 22:48:47
【问题描述】:

在阅读 Python 的 collections 模块 (http://hg.python.org/cpython/file/2.7/Lib/collections.py#l234) 的源代码时,我发现 namedtuple 函数从使用 exec 执行的字符串模板创建类的定义。为什么不通过简单地在函数内部定义一个类来完成它,就像你在编写装饰器时所做的那样?在我看来,它会更具可读性和更可靠的解决方案,不是吗?我敢打赌 Python 核心开发人员知道他们在做什么,那么我在这里缺少什么?

【问题讨论】:

  • 您对可读性和可靠性的衡量标准是什么?字符串模板当然读起来像一个类,可靠性应该已经通过单元测试得到证明。
  • 我的指标是常识和普遍接受的标准。按照collections这部分的例子,我们可以将任何一段代码放在一个字符串中,并用exec调用它。虽然使用常规的类定义(加上自省)可能被认为是“有点神奇”,但模板解决方案看起来更像是一个肮脏的黑客。但是我并不是说这不是最好的解决方案——这就是我问这个问题的原因。

标签: python python-2.7 collections namedtuple


【解决方案1】:

Raymond Hettinger 在他的original ActiveState recipe 中简要提到了这一点:

感谢 Peter Kovac 指出关键字中的缺陷 参数检查。由于他的 cmets,配方已经演变为 它当前的 exec 风格,我们可以在其中获得所有 Python 的高速内置函数 免费的参数检查。建设和执行的新风格 模板使__new__ 和__repr__ 函数更快, 比这个配方的以前版本更干净。

【讨论】:

  • 这是更全面的解释,因为它指出了这种方法背后的动机。谢谢你,先生!
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 2014-03-22
  • 2017-02-09
  • 1970-01-01
相关资源
最近更新 更多