Convert a namedtuple into a dictionary
dictionary, namedtuple, python, tuples
Solution
TL;DR: there's a method `_asdict` provided for this.
Here is a demonstration of the usage:
>>> from collections import namedtuple
>>> fields = ['name', 'population', 'coordinates', 'capital', 'state_bird']
>>> Town = namedtuple('Town', fields)
>>> funkytown = Town('funky', 300, 'somewhere', 'lipps', 'chicken')
>>> funkytown._asdict()
{'name': 'funky',
'population': 300,
'coordinates': 'somewhere',
'capital': 'lipps',
'state_bird': 'chicken'}
This is a documented method of namedtuples, i.e. unlike the usual convention in python the leading underscore on the method name isn't there to discourage use. Along with the other methods added to namedtuples, `_make`, `_replace`, `_source`, `_fields`, it has the underscore only to try and prevent conflicts with possible field names.
Note: For some 2.7.5 < python version < 3.5.0 code out in the wild, you might see this version:
>>> vars(funkytown)
OrderedDict([('name', 'funky'),
('population', 300),
('coordinates', 'somewhere'),
('capital', 'lipps'),
('state_bird', 'chicken')])
For a while the documentation had mentioned that `_asdict` was obsolete (see here), and suggested to use the built-in method vars. That advice is now outdated; in order to fix a bug related to subclassing, the `__dict__` property which was present on namedtuples has again been removed by this commit.
Problem
I have a named tuple class in python ``` class Town(collections.namedtuple('Town', [ 'name', 'population', 'coordinates', 'population', 'capital', 'state_bird'])): # ... ``` I'd like to convert Town instances into dictionaries. I don't want it to be rigidly tied to the names or number of the fields in a Town. Is there a way to write it such that I could add more fields, or pass an entirely different named tuple in and get a dictionary. I can not alter the original class definition as its in someone else's code. So I need to take an instance of a Town and convert it to a dictionary.