48

我想在内部使用 namedtuples,但我想保持与给我提供普通元组的用户的兼容性。

from collections import namedtuple

tuple_pi = (1, 3.14, "pi")  #Normal tuple 

Record = namedtuple("Record", ["ID", "Value", "Name"])

named_e = Record(2, 2.79, "e")  #Named tuple

named_pi = Record(tuple_pi)  #Error
TypeError: __new__() missing 2 required positional arguments: 'Value' and 'Name'

tuple_pi.__class__ = Record
TypeError: __class__ assignment: only for heap types
4

1 回答 1

70

您可以使用*args调用语法:

named_pi = Record(*tuple_pi)

这会将tuple_pi序列的每个元素作为单独的参数传递。

您还可以使用namedtuple._make()类方法将任何序列转换为实例:

named_pi = Record._make(tuple_pi)

演示:

>>> from collections import namedtuple
>>> Record = namedtuple("Record", ["ID", "Value", "Name"])
>>> tuple_pi = (1, 3.14, "pi")
>>> Record(*tuple_pi)
Record(ID=1, Value=3.14, Name='pi')
>>> Record._make(tuple_pi)
Record(ID=1, Value=3.14, Name='pi')
于 2014-07-28T16:49:39.010 回答