Fredrik Lundh wrote:
a dynamic registration approach would be even better, with a single entry point
used to register all methods and hooks your C extension has implemented, and
code on the other side that builds a properly initialized type descriptor from that
set, using fallback functions and error stubs where needed.

I knocked out a prototype of this last week, emailed Mr. Lundh about it, then forgot about it.  Would anyone be interested in taking a peek at it?

I only changed one file to use this new-style initialization, sha256module.c.  The resulting init_sha256() looks like this:

PyMODINIT_FUNC
init_sha256(void)
{
    PyObject *m;

    SHA224type = PyType_New("_sha256.sha224", sizeof(SHAobject), NULL);
    if (SHA224type == NULL)
        return;

    PyType_SetPointer(SHA224type, pte_dealloc, &SHA_dealloc);
    PyType_SetPointer(SHA224type, pte_methods, &SHA_methods);
    PyType_SetPointer(SHA224type, pte_members, &SHA_members);
    PyType_SetPointer(SHA224type, pte_getset, &SHA_getseters);

    if (PyType_Ready(SHA224type) < 0)
        return;

    SHA256type = PyType_New("_sha256.sha256", sizeof(SHAobject), NULL);
    if (SHA256type == NULL)
        return;

    PyType_SetPointer(SHA256type, pte_dealloc, &SHA_dealloc);
    PyType_SetPointer(SHA256type, pte_methods, &SHA_methods);
    PyType_SetPointer(SHA256type, pte_members, &SHA_members);
    PyType_SetPointer(SHA256type, pte_getset, &SHA_getseters);

    if (PyType_Ready(SHA256type) < 0)
        return;

    m = Py_InitModule("_sha256", SHA_functions);
    if (m == NULL)
        return;
}

In a way this wasn't really a good showpiece for my code.  The "methods", "members", and "getseters" structs still need to be passed in.  However, I did change all four "as_" structures so you can set those directly.  For instance, the "concat" as_sequence method for a PyString object would be set using
        PyType_SetPointer(PyString_Type, pte_sequence_concat, string_concat);
(I actually converted the PyString object to my new code, but had chicken-and-egg initialization problems as a result and backed out of it.  The code is still in the branch, just commented out.)

Patch available for interested parties,


larry