_asdict in Python 3 namedtuple 子类 returns 空字典

_asdict in Python 3 namedtuple subclass returns empty dictionary

如何使用 namedtuple 的 Python 3 子类中的 _asdict

这是我试过的:

class A(namedtuple('B', 'c')):
    pass

a = A(3)

a._asdict()
{}

这在 Python 2 和 returns 中工作正常:

OrderedDict([('c', 3)])

您必须从 collections 导入 namedtuple。使用 Python 3.5.2:

测试
>>> from collections import namedtuple
>>>
>>> class A(namedtuple('B', 'c')):
...     pass
...
>>> a = A(3)
>>>
>>> a._asdict()
OrderedDict([('c', 3)])

你对最后的空字典有什么期待?

>>> {}
{}

据我所知,此行为在 Issue 24931 中被列为错误并已修复。版本 3.5.2 中存在正确的行为(Python 2.x 不受此影响。)

使用我当前版本的 Python (3.5.2) 这按预期执行:

class A(namedtuple('B', 'c')): 
    pass

A(3)._asdict()
Out[7]: OrderedDict([('c', 3)])

所以,简而言之,要么考虑更新到 3.5.1+,要么,如果不能,请自己实施 _asdict;这是问题跟踪器上的 stated in a message,似乎是一个可行的替代方案:

from collections import namedtuple, OrderedDict

class A(namedtuple('B', 'c')):
    def _asdict(self):
        return OrderedDict(zip(self._fields, self))

随心所欲。

这似乎是 Python 3.x 的错误,已在 3.4.2 和 3.4.5 之间的某处解决。

要让 _asdict() 在您的 class 上设置 __slots__ = () 受影响的版本:

class A(namedtuple('B', 'c')):
    __slots__ = ()