1

私は最近発見namedtupleし、厄介な大規模なクラス定義を置き換えるために使用したいと考えていますが、選択したばかりの値のオブジェクトの名前を取得するスマートな方法があるかどうかに興味があります。不明な場合は以下の例を参照してください。

MyStruct = namedtuple("MyStruct","Var1 Var2 Var3")
Instance = MyStruct(1,2,3)
# What I currently do (but hopefully there is a smarter way to do this)
print "Var1:\t"+str(Instance.Var1)+"Var2:\t"+str(Instance.Var2) #and so forth

_fields次のようなオプションがあることを知っています。

for x in Instance._fields:
  if str(x) == "Var1" or ... : # I only want to show certain objects at this time
    print x, getattr(Instance,x)

それでも、私にはかなり非Pythonicに見えるので、これを行うためのより良い方法はありますか?

4

2 に答える 2

1

namedtupleインスタンスには、順序付けられた辞書を返すnamedtuple._asdict()メソッドがあります。

>>> from collections import namedtuple
>>> MyStruct = namedtuple("MyStruct", "Var1 Var2 Var3")
>>> value = MyStruct('foo', 'bar', 'baz')
>>> value._asdict()
OrderedDict([('Var1', 'foo'), ('Var2', 'bar'), ('Var3', 'baz')])

これにより、コンテンツに対応するキーと値を持つ順序付けられた辞書が得られます。

ただし、何を達成しようとしているのかは明確ではありません。適切なフィールドを直接選択するだけで何が問題なのですか?

print 'Var1: {}'.format(value.Var1)

または特定のフィールドをstr.format()次のように選択します。

print 'Var1: {0.Var1}, Var3: {0.Var3}'.format(value)
于 2013-11-07T15:57:54.220 に答える
0

namedtuplesインデックスを付けることができるので、1 つを に変換しdictたり、必要なことを行うために使用vars()したりする必要はありません。

MyStruct = namedtuple("MyStruct","Var1 Var2 Var3")
instance = MyStruct(1, 2, 3)

fields_to_print = {'Var1', 'Var2'}
print(', '.join('{}: {}'.format(field, instance[i])
        for i, field in enumerate(instance._fields)
            if field in fields_to_print))

出力:

Var1: 1, Var2: 2
于 2013-11-07T18:11:25.447 に答える