【发布时间】:2016-03-13 23:56:40
【问题描述】:
在 Python 3.5.0 上:
>>> from collections import namedtuple
>>> cluster = namedtuple('Cluster', ['a', 'b'])
>>> c = cluster(a=4, b=9)
>>> c
Cluster(a=4, b=9)
>>> vars(c)
OrderedDict([('a', 4), ('b', 9)])
在 Python 3.5.1 上:
>>> from collections import namedtuple
>>> cluster = namedtuple('Cluster', ['a', 'b'])
>>> c = cluster(a=4, b=9)
>>> c
Cluster(a=4, b=9)
>>> vars(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: vars() argument must have __dict__ attribute
似乎namedtuple 的某些内容发生了变化(或者可能是vars() 的某些内容?)。
这是故意的吗?难道我们不应该再使用这种模式将命名元组转换为字典了吗?
【问题讨论】:
-
@user2357112 - 是的,我认为这种更改应该在更改日志中注明。这就是让我起初认为这可能是一个错误的原因。
-
“我们不应该再使用这种模式将命名元组转换为字典了吗”我想我们从来没有不应该使用这种模式,因为
vars(x)被记录为返回x.__dict__,但我认为从未记录过namedtuple实例具有__dict__属性。我知道,argparse模块中的Namespace实例 记录了这种模式,所以也许这就是趋势出现的地方。无论如何,我敢肯定会有一些代码中断的开发人员感到惊讶,所以这是一个很好的问题。 -
很公平。此外,我更正了
vars()的使用从未被记录在案:在 Python 3.3 docs 它指出the same effect can be achieved by using the built-in vars() function在提及_asdict()的功能时。 -
@BlacklightShining 这确实是python中的约定,但这是规则的例外。 docs 中提到“为防止与字段名冲突,方法名和属性名以下划线开头。”
-
@JeremyBanks 可以说他们确实修复了一个错误。该错误允许第一个示例工作,但在第二个示例中破坏了它。当然,正如 jme 所提到的,该错误实际上被记录为一个功能......
标签: python typeerror python-3.5 namedtuple