Skip to content
9 changes: 6 additions & 3 deletions Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -2285,9 +2285,12 @@ def _signature_fromstr(cls, obj, s, skip_bound_arg=True):

module = None
module_dict = {}
module_name = (getattr(obj, '__module__', None) or
getattr(getattr(obj, '__objclass__', None),
'__module__', None))

module_name = getattr(obj, '__module__', None)
if not module_name:
objclass = getattr(obj, '__objclass__', None)
module_name = getattr(objclass, '__module__', None)

if module_name:
module = sys.modules.get(module_name, None)
if module:
Expand Down
7 changes: 0 additions & 7 deletions Lib/test/test_capi/test_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import contextlib
import importlib.machinery
import importlib.util
import inspect
import json
import os
import pickle
Expand Down Expand Up @@ -184,12 +183,6 @@ def test_docstring_signature_parsing(self):
self.assertEqual(_testcapi.docstring_with_signature_and_extra_newlines.__text_signature__,
"($module, /, parameter)")

@unittest.skipIf(MISSING_C_DOCSTRINGS,
"Signature information for builtins requires docstrings")
def test_signature_parsing_with_defaults(self):
meth = _testcapi.DocStringUnrepresentableSignatureTest.with_default
self.assertEqual(str(inspect.signature(meth)), '(self, /, x=1)')

def test_c_type_with_matrix_multiplication(self):
M = _testcapi.matmulType
m1 = M()
Expand Down
7 changes: 7 additions & 0 deletions Lib/test/test_inspect/test_inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -3069,6 +3069,13 @@ def test_signature_on_builtins_no_signature(self):
self.assertEqual(inspect.signature(builtin),
inspect.signature(template))

@unittest.skipIf(MISSING_C_DOCSTRINGS,
"Signature information for builtins requires docstrings")
def test_signature_parsing_with_defaults(self):
_testcapi = import_helper.import_module("_testcapi")
meth = _testcapi.DocStringUnrepresentableSignatureTest.with_default
self.assertEqual(str(inspect.signature(meth)), '(self, /, x=1)')

def test_signature_on_non_function(self):
with self.assertRaisesRegex(TypeError, 'is not a callable object'):
inspect.signature(42)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
Fix :func:`inspect.signature()` to correctly set extension module for
built-in instance methods.
Fix :func:`inspect.signature()` to correctly set extension module for built-in
instance methods. They lacks ``__module__`` attribute, so we use instead
``__objclass__.__module__`` attribute.