如何从namedtuple
的Python 3子类中使用_asdict
?_asdict in Python 3 namedtuple子类返回空字典
这是我已经试过:
class A(namedtuple('B', 'c')):
pass
a = A(3)
a._asdict()
{}
这在Python 2工作正常,返回:
OrderedDict([('c', 3)])
如何从namedtuple
的Python 3子类中使用_asdict
?_asdict in Python 3 namedtuple子类返回空字典
这是我已经试过:
class A(namedtuple('B', 'c')):
pass
a = A(3)
a._asdict()
{}
这在Python 2工作正常,返回:
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))
表现为你所需要的。
你必须从collections
进口namedtuple
。使用Python 3.5.2测试:
>>> from collections import namedtuple
>>>
>>> class A(namedtuple('B', 'c')):
... pass
...
>>> a = A(3)
>>>
>>> a._asdict()
OrderedDict([('c', 3)])
您对期末空字典有什么期待?
>>> {}
{}
这似乎是Python 3.x的一个错误,它已经在3.4.2和3.4.5之间的某个地方解决了。
要获得_asdict()
对受影响的版本工作类设置__slots__ =()
:
class A(namedtuple('B', 'c')):
__slots__ =()
谢谢!升级python并不容易。但是,您的链接有一个很好的解决方法:https://bugs.python.org/issue24931#msg256995 – Oin
我看@Oin,我将包括那些可能遇到此问题的其他人的简短解决方法! :-) –