Petr Viktorin <encu...@gmail.com> added the comment:
I don't see how instantiating a metaclass with non-default tp_new would work if you don't know some details about the specific metaclass. So IMO we can we limit ourselves to scenarios where either: 1) the metaclass uses default tp_new, or 2) the code that creates the class knows about the metaclass For case 2), we could leave allocation to the calling code, and add an API function that does the rest of the work of applying the spec. Something like: /* Create a metaclass */ metatype_spec = {stuff}; metatype = PyType_FromSpecAndBases(&metatype_spec, &PyType_Type); /* Create a type */ type_spec = {other_stuff}; newtype = alloc_metatype(); PyType_ApplySpec(newtype, &type_spec); PyType_ApplySpec would assert PyType_Ready wasn't called before, and call it after filling in the name, slots, etc. The metatype could disable its tp_new to disallow PyType_FromSpec (and Python __new__), effectively enforcing "using_metaclass_cinit_pretty_promise_please". There could be a slot for code to run at the end of PyType_ApplySpec -- the "PyArray_InitDTypeFromSpec" in your pseudocode. That seems better than calling the metaclass, but to answer questions on that idea: >> - basicsize/itemsize could be allowed with __basicsize__/__itemsize__ in the >> dict. >Do we need this? I need the basicsize of the metaclass, but that of the class >seems fixed/OK? That's the size of the instance. One more level down :) >> - members could theoretically be copied to individual descriptors; there >> doesn't seem much need for keeping tp_members around. > But a Python MetaClass (that the author may not even realize about) might > need access to these to work properly? > A bit far fetched, but... Seems very far-fetched to me. IMO these, like e.g. tp_methods, should only be used as arguments for the code that puts the descriptors in __dict__. How the descriptors got there is a detail, the class doesn't need to use tp_members (nor advertise that it does). ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue45383> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com