1

我最近发现namedtuple并想用它来替换我的 icky 大类定义,但我很好奇是否有一种聪明的方法来检索我刚刚选择的值的对象名称,如果不清楚,请参阅下面的示例;

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可以被索引,所以你不需要把一个变成 adict或者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 回答