J wrote:

> I have looked at some of the source code in PyObject_GenericGetAttr and
> it turns out that the object has no dictionary. It seens that the
> address of the dictionary is computed somehow via tp_dictoffset in the
> type object.

I asked this a few months ago......

Basically, you need a PyObject * in your object record:

        struct PyStruct {
                PY_OBJECT_HEAD
                // ...
                PyObject *dict;
                // ....
        }


then add the offset to the tp_dictoffset member in the type struct:

        PyTypeObject PyType {
                // ....
                offsetof(PyStruct, dict),       /* tp_dictoffset */
                // ...

Make sure you init this member to 0 (tp_init), and make sure you 
PyXDECREF() it when the object is deleted (tp_dealloc).

Optionally: add a __dict__ entry to the PyMemberDefs so that 
obj.__dict__ works (tho this is not necessary):

            {"__dict__", T_OBJECT, offsetof(PyStruct, dict), READONLY },

The ROOOOOOLY cool bit:  You don't need to add the dictionary with 
PyDict_New() etc, because the python runtime will create this dict the 
first time a new attrribute is added.  So the cost of this feature for 
object instances that don't have extra attributes is just 4 unused bytes 
in the instance record!  This is just sooooooo cool.


Greg.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to