module = None
module_dict = {}
+
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:
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)
--- /dev/null
+Fix :func:`inspect.signature()` to correctly handle parameter defaults
+on methods in extension modules that use names defined in the module
+namespace.
"--\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},
};
if (PyModule_AddType(mod, &DocStringUnrepresentableSignatureTest) < 0) {
return -1;
}
+ if (PyModule_AddObject(mod, "ONE", PyLong_FromLong(1)) < 0) {
+ return -1;
+ }
return 0;
}