-
-
Notifications
You must be signed in to change notification settings - Fork 30.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpo-42100: Add _PyType_GetModuleByDef #22835
Conversation
3adafc3
to
0b0d93c
Compare
See #22838 for example usage. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit comment.
IMHO, we can use C99 features since some of the module already use other c99 features.
(for example, struct init)
assert(PyType_Check(type)); | ||
assert(type->tp_mro); | ||
int i; | ||
for (i = 0; i < PyTuple_GET_SIZE(type->tp_mro); i++) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
for (i = 0; i < PyTuple_GET_SIZE(type->tp_mro); i++) { | |
for (int i = 0; i < PyTuple_GET_SIZE(type->tp_mro); i++) { |
{ | ||
assert(PyType_Check(type)); | ||
assert(type->tp_mro); | ||
int i; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
int i; |
IMO that's a code style issue, and PEP7 has nothing against it. I'd rather keep it as is. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, petr. I have no any other comment in here.
PS: I have reviewed it months ago in fork repo~
Thanks! And thanks for the other review – this PR includes the changes you pointed out :) |
When a type has no subclass but a long MRO, _PyType_GetModuleByDef() has to iterate on the N parent classes before reaching the last one which will match. Would it be more efficient to iterator on the MRO in the reverse order? It would make the function slower for subclasses, but faster for direct instance of the type. |
Usually, when I read "get", I expect a O(1) operation. I'm fine if the first call fills a cache and is slower. But here, every call has a complexity of O(n) where n is the length of the MRO tuple. Would it make sense to rename the function to Anyway, thanks for adding this function! It will unblock porting many extension modules to multi-phase init and heap types in https://bugs.python.org/issue1635741 ! |
About _PyType_FindModuleByDef() name, here is a more concrete example: the PR #23124 converts the array extension to multi-phase init. The current PR defines:
I would prefer to use "find" in the first macro, to better highlight that "get_array_state_by_type()" is a fast attribute access:
|
Hm, I don't expect that. "get" can mean many things :) I'll keep it in mind for if/when it becomes public API. I don't think it's worth changing the name now, after all the discussion. |
See https://mail.python.org/archives/list/capi-sig@python.org/thread/T3P2QNLNLBRFHWSKYSTPMVEIL2EEKFJU/ for discussion.
https://bugs.python.org/issue42100