mirror of
https://github.com/python/cpython.git
synced 2025-08-15 06:10:47 +00:00
bpo-34706: Preserve subclassing in inspect.Signature.from_callable (GH-16108) (GH-16113)
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 GH-9344.
(cherry picked from commit 5b9ff7a0dc
)
Co-authored-by: Gregory P. Smith <greg@krypto.org>
This commit is contained in:
parent
10873831ed
commit
cf25765cf7
3 changed files with 11 additions and 3 deletions
|
@ -2367,7 +2367,7 @@ def _signature_from_callable(obj, *,
|
||||||
if (obj.__init__ is object.__init__ and
|
if (obj.__init__ is object.__init__ and
|
||||||
obj.__new__ is object.__new__):
|
obj.__new__ is object.__new__):
|
||||||
# Return a signature of 'object' builtin.
|
# Return a signature of 'object' builtin.
|
||||||
return signature(object)
|
return sigcls.from_callable(object)
|
||||||
else:
|
else:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
'no signature found for builtin type {!r}'.format(obj))
|
'no signature found for builtin type {!r}'.format(obj))
|
||||||
|
|
|
@ -3157,14 +3157,21 @@ class TestSignatureObject(unittest.TestCase):
|
||||||
class MySignature(inspect.Signature): pass
|
class MySignature(inspect.Signature): pass
|
||||||
def foo(a, *, b:1): pass
|
def foo(a, *, b:1): pass
|
||||||
foo_sig = MySignature.from_callable(foo)
|
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.assertIsInstance(foo_sig, MySignature)
|
||||||
|
|
||||||
@unittest.skipIf(MISSING_C_DOCSTRINGS,
|
@unittest.skipIf(MISSING_C_DOCSTRINGS,
|
||||||
"Signature information for builtins requires docstrings")
|
"Signature information for builtins requires docstrings")
|
||||||
def test_signature_from_callable_builtin_obj(self):
|
def test_signature_from_callable_builtin_obj(self):
|
||||||
class MySignature(inspect.Signature): pass
|
class MySignature(inspect.Signature): pass
|
||||||
sig = MySignature.from_callable(_pickle.Pickler)
|
sig = MySignature.from_callable(_pickle.Pickler)
|
||||||
self.assertTrue(isinstance(sig, MySignature))
|
self.assertIsInstance(sig, MySignature)
|
||||||
|
|
||||||
def test_signature_definition_order_preserved_on_kwonly(self):
|
def test_signature_definition_order_preserved_on_kwonly(self):
|
||||||
for fn in signatures_with_lexicographic_keyword_only_parameters():
|
for fn in signatures_with_lexicographic_keyword_only_parameters():
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Preserve subclassing in inspect.Signature.from_callable.
|
Loading…
Add table
Add a link
Reference in a new issue