bpo-34706: Preserve subclassing in inspect.Signature.from_callable (G… · python/cpython@3906920 (original) (raw)

3 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -2358,7 +2358,7 @@ def _signature_from_callable(obj, *,
2358 2358 if (obj.__init__ is object.__init__ and
2359 2359 obj.__new__ is object.__new__):
2360 2360 # Return a signature of 'object' builtin.
2361 -return signature(object)
2361 +return sigcls.from_callable(object)
2362 2362 else:
2363 2363 raise ValueError(
2364 2364 'no signature found for builtin type {!r}'.format(obj))
Original file line number Diff line number Diff line change
@@ -3050,14 +3050,21 @@ def test_signature_from_callable_python_obj(self):
3050 3050 class MySignature(inspect.Signature): pass
3051 3051 def foo(a, *, b:1): pass
3052 3052 foo_sig = MySignature.from_callable(foo)
3053 -self.assertTrue(isinstance(foo_sig, MySignature))
3053 +self.assertIsInstance(foo_sig, MySignature)
3054 +
3055 +def test_signature_from_callable_class(self):
3056 +# A regression test for a class inheriting its signature from `object`.
3057 +class MySignature(inspect.Signature): pass
3058 +class foo: pass
3059 +foo_sig = MySignature.from_callable(foo)
3060 +self.assertIsInstance(foo_sig, MySignature)
3054 3061
3055 3062 @unittest.skipIf(MISSING_C_DOCSTRINGS,
3056 3063 "Signature information for builtins requires docstrings")
3057 3064 def test_signature_from_callable_builtin_obj(self):
3058 3065 class MySignature(inspect.Signature): pass
3059 3066 sig = MySignature.from_callable(_pickle.Pickler)
3060 -self.assertTrue(isinstance(sig, MySignature))
3067 +self.assertIsInstance(sig, MySignature)
3061 3068
3062 3069 def test_signature_definition_order_preserved_on_kwonly(self):
3063 3070 for fn in signatures_with_lexicographic_keyword_only_parameters():
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1 +Preserve subclassing in inspect.Signature.from_callable.