I have recently discovered namedtuple
and want to use it to replace my icky large class definitions but I am curious if there is a smart way to retrieve the object\
A namedtuple
instance has a namedtuple._asdict() method that returns an ordered dictionary:
>>> from collections import namedtuple
>>> MyStruct = namedtuple("MyStruct", "Var1 Var2 Var3")
>>> value = MyStruct('foo', 'bar', 'baz')
>>> value._asdict()
OrderedDict([('Var1', 'foo'), ('Var2', 'bar'), ('Var3', 'baz')])
This gives you an ordered dictionary with keys and values corresponding to the contents.
However, it is not clear to me what you are trying to achieve; what exactly is wrong with just selecting the right field directly?
print 'Var1: {}'.format(value.Var1)
or picking out specific fields with str.format()
:
print 'Var1: {0.Var1}, Var3: {0.Var3}'.format(value)
namedtuples
can be indexed, so you don't need to turn one into a dict
or use vars()
to do what you want:
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))
Output:
Var1: 1, Var2: 2