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/