Skip to content

Empty __module__ attribute for built-in static methods #115231

Description

@skirpichev

Bug report

Bug description:

An example:

>>> bytes.maketrans.__module__ is None
True

c.f. pure-python staticmethod:

>>> class Spam:
...     @staticmethod
...     def foo():
...         pass
... 
>>> Spam.foo.__module__
'__main__'

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() has type argument and we could query value of its __module__ attribute.

Edit: BTW, same happens for class methods, e.g.:

>>> int.from_bytes.__module__ is None
True

Probably this should be fixed as well.

CPython versions tested on:

CPython main branch

Operating systems tested on:

No response

Linked PRs

Activity

  1. added a commit that references this issue on Feb 10, 2024
  2. added a commit that references this issue on Feb 26, 2024
  3. added a commit that references this issue on Jul 19, 2024
  4. serhiy-storchaka commented on Nov 2, 2024

    @serhiy-storchaka
    Member

    Built-in static and class methods has different types than static and class methods in Python classes. This is not a bug.

    Static and class methods in Python classes started to inherit function attributes only since 3.10 (bpo-43682/gh-87848). cc @vstinner

  5. added
    type-featureA feature request or enhancement
    3.14bugs and security fixes
    and removed
    type-bugAn unexpected behavior, bug, or error
    on Nov 2, 2024
  6. skirpichev commented on Nov 2, 2024

    @skirpichev
    MemberAuthor

    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__'
    >>> 
  7. serhiy-storchaka commented on Nov 2, 2024

    @serhiy-storchaka
    Member

    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.

  8. skirpichev commented on Nov 2, 2024

    @skirpichev
    MemberAuthor

    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() resolves module_dict to empty for e.g. bytes.maketrans() or int.from_bytes(). That essentially forbids e.g. using module constants as default values.

  9. added
    interpreter-core(Objects, Python, Grammar, and Parser dirs)
    and removed
    3.14bugs and security fixes
    on Dec 15, 2024
  10. self-assigned this
    on Oct 14, 2025
  11. removed their assignment
    on Oct 27, 2025
  12. added a commit that references this issue on Feb 2, 2026
  13. added a commit that references this issue on Feb 3, 2026
  14. added a commit that references this issue on Feb 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)type-featureA feature request or enhancement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions