Skip to content

Commit 8988a7c

Browse files
committed
Recover the module of extension-type methods from __self__
1 parent 8eb317c commit 8988a7c

2 files changed

Lines changed: 18 additions & 3 deletions

File tree

Lib/annotationlib.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,10 +1090,17 @@ def type_repr(value):
10901090
10911091
"""
10921092
if isinstance(value, (type, types.FunctionType, types.BuiltinFunctionType)):
1093-
# Built-in methods have __module__ set to None.
1094-
if value.__module__ is None or value.__module__ == "builtins":
1093+
module = value.__module__
1094+
if module is None:
1095+
# Built-in methods have __module__ set to None; recover the module
1096+
# from the bound object (the class itself for class-bound methods).
1097+
obj = getattr(value, "__self__", None)
1098+
if obj is not None:
1099+
cls = obj if isinstance(obj, type) else type(obj)
1100+
module = cls.__module__
1101+
if module is None or module == "builtins":
10951102
return value.__qualname__
1096-
return f"{value.__module__}.{value.__qualname__}"
1103+
return f"{module}.{value.__qualname__}"
10971104
elif isinstance(value, _Template):
10981105
tree = _template_to_ast(value)
10991106
return ast.unparse(tree)

Lib/test/test_annotationlib.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,6 +1854,14 @@ def nested():
18541854
self.assertEqual(type_repr([].append), "list.append")
18551855
self.assertEqual(type_repr((1).bit_length), "int.bit_length")
18561856
self.assertEqual(type_repr(dict.fromkeys), "dict.fromkeys")
1857+
# Methods of extension types also have __module__ set to None, but
1858+
# are not in the builtins module.
1859+
import datetime
1860+
self.assertEqual(
1861+
type_repr(datetime.datetime(2000, 1, 1).isoformat),
1862+
"datetime.datetime.isoformat",
1863+
)
1864+
self.assertEqual(type_repr(datetime.date.today), "datetime.date.today")
18571865
self.assertEqual(type_repr(type_repr), "annotationlib.type_repr")
18581866
self.assertEqual(type_repr(times_three), f"{__name__}.times_three")
18591867
self.assertEqual(type_repr(...), "...")

0 commit comments

Comments
 (0)