C-API, tp_dictoffset vs tp_members
"Martin v. Löwis"
martin at v.loewis.de
Sun Jul 26 04:04:12 EDT 2009
> When would I use PyObject_SetAttrString/tp_dictoffset instead of tp_members?
When I have a variable list of attributes, and cannot statically know
what those attributes might be.
> I have a predefined set of members, some of which are optional.
Having optional fields is also a good reason.
> The problem
> I had with an embedded dictionary was that I can't see its elements using
How so? That should work fine.
> Now I just converted to using tp_members, and it still seems to
> work correctly for the cases I tested.
So how do you do optional fields now? In particular, how would you do
> Even better, I can declare the fields
> as read-only then and add doc-strings. So, I wonder, what made the original
> author use tp_dictoffset instead?
Most likely, it was the simplest approach. This code only wants to set
the attributes, and never read them. It's easier to maintain: if you
want to add a field with tp_members, you have to change multiple places,
and you have to consider garbage collection (assuming you have embedded
objects). With tp_dictoffset, adding another attribute is easy.
More information about the Python-list