web-dev-qa-db-ja.com

タプルをnamedtupleにキャストする方法は?

名前付きタプルを内部で使用したいのですが、通常のタプルをフィードするユーザーとの互換性を維持したいと思います。

from collections import namedtuple

tuplePi=(1,3.14,"pi") #Normal Tuple 

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

namedE=Record(2, 2.79, "e") #Named Tuple

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

tuplePi.__class__=Record
TypeError: __class__ assignment: only for heap types
30
Adam Ryczkowski

_*args_呼び出し構文を使用できます。

_namedPi = Record(*tuplePi)
_

これは、tuplePiシーケンスの各要素を個別の引数として渡します。

namedtuple._make() class method を使用して、任意のシーケンスをインスタンスに変換することもできます。

_namedPi = Record._make(tuplePi)
_

デモ:

_>>> from collections import namedtuple
>>> Record = namedtuple("MyNamedTuple", ["ID", "Value", "Name"])
>>> tuplePi = (1, 3.14, "pi")
>>> Record(*tuplePi)
MyNamedTuple(ID=1, Value=3.14, Name='pi')
>>> Record._make(tuplePi)
MyNamedTuple(ID=1, Value=3.14, Name='pi')
_
42
Martijn Pieters