Skip to content
Merged
4 changes: 3 additions & 1 deletion Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -2283,7 +2283,9 @@ def _signature_fromstr(cls, obj, s, skip_bound_arg=True):

module = None
module_dict = {}
module_name = getattr(obj, '__module__', None)
module_name = (getattr(obj, '__module__', None) or
getattr(getattr(obj, '__objclass__', None),
'__module__', None))
if module_name:
module = sys.modules.get(module_name, None)
if module:
Expand Down
7 changes: 7 additions & 0 deletions Lib/test/test_capi/test_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import contextlib
import importlib.machinery
import importlib.util
import inspect
import json
import os
import pickle
Expand Down Expand Up @@ -183,6 +184,12 @@ 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix :func:`inspect.signature()` to correctly set extension module for
built-in instance methods.
10 changes: 10 additions & 0 deletions Modules/_testcapi/docstring.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,13 @@ static PyMethodDef DocStringUnrepresentableSignatureTest_methods[] = {
"--\n\n"
"This docstring has a signature with unrepresentable default."
)},
{"with_default",
(PyCFunction)test_with_docstring, METH_VARARGS,
PyDoc_STR(
"with_default($self, /, x=ONE)\n"
"--\n\n"
"This instance method has a default parameter value from the module scope."
)},
{NULL},
};

Expand All @@ -193,5 +200,8 @@ _PyTestCapi_Init_Docstring(PyObject *mod)
if (PyModule_AddType(mod, &DocStringUnrepresentableSignatureTest) < 0) {
return -1;
}
if (PyModule_AddObject(mod, "ONE", PyLong_FromLong(1)) < 0) {
return -1;
}
return 0;
}