Repository navigation
Empty __module__ attribute for built-in static methods #115231
Description
Activity
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Feb 10, 2024 - addedtype-featureA feature request or enhancementA feature request or enhancement3.14bugs and security fixesbugs and security fixesand removedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Nov 2, 2024 Static and class methods in Python classes started to inherit function attributes only since 3.10
Hmm, above code snippet works on 3.8+ as well, e.g.:
Python 3.9.19+ (heads/3.9:3f5d9d12c7, Aug 29 2024, 13:17:09) [GCC 12.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> class Spam: ... @staticmethod ... def foo(): ... pass ... >>> Spam.foo.__module__ '__main__' >>>
Static and class methods in Python classes copy attributes from the wrapped methods. But unbound built-in methods do not have the
__module__attribute, so not copying it is okay. On other hand, bound built-in methods have__module__equal to None:>>> collections.deque.append.__module__ Traceback (most recent call last): File "<python-input-15>", line 1, in <module> collections.deque.append.__module__ AttributeError: 'method_descriptor' object has no attribute '__module__'. Did you mean: '__reduce__'? >>> collections.deque().append.__module__ is None True
We should first decide whether we need the
__module__attribute for regular builtin methods.We should first decide whether we need the
__module__attribute for regular builtin methods.That should be helpful for introspection. E.g. now the
inspect._signature_fromstr()resolvesmodule_dictto empty for e.g.bytes.maketrans()orint.from_bytes(). That essentially forbids e.g. using module constants as default values.- addedinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)and removed3.14bugs and security fixesbugs and security fixes
on Dec 15, 2024
Bug report
Bug description:
An example:
c.f. pure-python staticmethod:
I'm not sure, maybe this should be treated rather as a feature request. Docs says about the attribute value: "The name of the module the function was defined in, or None if unavailable." But clearly, this value is available: the
type_add_method()hastypeargument and we could query value of its__module__attribute.Edit: BTW, same happens for class methods, e.g.:
Probably this should be fixed as well.
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response
Linked PRs