I’m not a big fan of namedtuples in Python, but sometimes they are useful.
For example, sys.version_info
returns a named tuple (starting with Python 2.7):
sys.version_info(major=2, minor=7, micro=2, releaselevel='final', serial=0)
This means that in order to check the major number you may do sys.version_info[0]
or sys.version_info.major
. Of course, the latter is more readable.
You can use collections.namedtuple in order to create a named tuple in Python, but what if you want to create such an object in a C extension module?
I found myself diving the CPython source looking for this, and I found it: PyStructSequence
. There is not documentation for it at the moment, but there is an issue open for it here. It’s not very complex to use, but I created a very simple example:
[gist]https://gist.github.com/2473614[/gist]
The example shows how a PyStructSequence
is created and exposed in a module. Operations with this types of objects are very similar to those with regular tuples (in C), so in order to set an item you’d do the following:
PyStructSequence_SET_ITEM(my_named_tuple, 0, PyString_FromString("content for field 0"));
PyStructSequence_SET_ITEM(my_named_tuple, 1, PyString_FromString("content for field 1"));
...
That’s about it, in case you want to dive deeper I recommend having a look at Modules/posixmodule.c
in the CPython source code and checking how stat_result
is defined.
:wq