如何從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,我將包括那些可能遇到此問題的其他人的簡短解決方法! :-) –