PyStructSequence: creating named tuples in C
I’m not a big fan of named tuples 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:
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