2016-11-18 161 views

回答

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)) 

表現爲你所需要的。

+1

謝謝!升級python並不容易。但是,您的鏈接有一個很好的解決方法:https://bugs.python.org/issue24931#msg256995 – Oin

+1

我看@Oin,我將包括那些可能遇到此問題的其他人的簡短解決方法! :-) –

0

你必須從collections進口namedtuple。使用Python 3.5.2測試:

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

您對期末空字典有什麼期待?

>>> {} 
{} 
0

這似乎是Python 3.x的一個錯誤,它已經在3.4.2和3.4.5之間的某個地方解決了。

要獲得_asdict()對受影響的版本工作類設置__slots__ =()

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