2016-11-18 157 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__ =()