_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__ = ()
如何使用 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__ = ()