From 82f3491b4d8cf63015feff88c08835b84f2f4647 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Fri, 13 Sep 2019 15:07:05 +0100 Subject: [PATCH 1/2] https://bugs.python.org/issue34706 Specifically in the case of a class that does not override its constructor signature inherited from object. These are Buck Evan @bukzor's changes cherrypicked from PR 9344. --- Lib/inspect.py | 2 +- Lib/test/test_inspect.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index 0a57749ccdd458..c2a1ed4148e749 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -2367,7 +2367,7 @@ def _signature_from_callable(obj, *, if (obj.__init__ is object.__init__ and obj.__new__ is object.__new__): # Return a signature of 'object' builtin. - return signature(object) + return sigcls.from_callable(object) else: raise ValueError( 'no signature found for builtin type {!r}'.format(obj)) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 6c9f5297780754..0c2412ee6bdc1c 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -3155,6 +3155,13 @@ def foo(a, *, b:1): pass foo_sig = MySignature.from_callable(foo) self.assertTrue(isinstance(foo_sig, MySignature)) + def test_signature_from_callable_class(self): + # A regression test for a class inheriting its signature from `object`. + class MySignature(inspect.Signature): pass + class foo: pass + foo_sig = MySignature.from_callable(foo) + self.assertTrue(isinstance(foo_sig, MySignature)) + @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") def test_signature_from_callable_builtin_obj(self): From dda242a9cb04c7ac4125f069ee231d0597947928 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Fri, 13 Sep 2019 15:09:31 +0100 Subject: [PATCH 2/2] NEWS entry and assertIsInstance Addresses PR 9344 feedback. --- Lib/test/test_inspect.py | 6 +++--- .../next/Library/2019-09-13-14-54-33.bpo-34706.HWVpOY.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-09-13-14-54-33.bpo-34706.HWVpOY.rst diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 0c2412ee6bdc1c..7148dfa0bab94f 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -3153,21 +3153,21 @@ def test_signature_from_callable_python_obj(self): class MySignature(inspect.Signature): pass def foo(a, *, b:1): pass foo_sig = MySignature.from_callable(foo) - self.assertTrue(isinstance(foo_sig, MySignature)) + self.assertIsInstance(foo_sig, MySignature) def test_signature_from_callable_class(self): # A regression test for a class inheriting its signature from `object`. class MySignature(inspect.Signature): pass class foo: pass foo_sig = MySignature.from_callable(foo) - self.assertTrue(isinstance(foo_sig, MySignature)) + self.assertIsInstance(foo_sig, MySignature) @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") def test_signature_from_callable_builtin_obj(self): class MySignature(inspect.Signature): pass sig = MySignature.from_callable(_pickle.Pickler) - self.assertTrue(isinstance(sig, MySignature)) + self.assertIsInstance(sig, MySignature) def test_signature_definition_order_preserved_on_kwonly(self): for fn in signatures_with_lexicographic_keyword_only_parameters(): diff --git a/Misc/NEWS.d/next/Library/2019-09-13-14-54-33.bpo-34706.HWVpOY.rst b/Misc/NEWS.d/next/Library/2019-09-13-14-54-33.bpo-34706.HWVpOY.rst new file mode 100644 index 00000000000000..1df3742abd272f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-13-14-54-33.bpo-34706.HWVpOY.rst @@ -0,0 +1 @@ +Preserve subclassing in inspect.Signature.from_callable.