Skip to content

Commit

Permalink
[3.11] gh-105080: Fixed inconsistent signature on derived classes (GH… (
Browse files Browse the repository at this point in the history
  • Loading branch information
gaogaotiantian authored Jun 4, 2023
1 parent 86eab08 commit aca77b5
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 11 deletions.
23 changes: 12 additions & 11 deletions Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -2538,17 +2538,18 @@ def _signature_from_callable(obj, *,
factory_method = None
new = _signature_get_user_defined_method(obj, '__new__')
init = _signature_get_user_defined_method(obj, '__init__')
# Now we check if the 'obj' class has an own '__new__' method
if '__new__' in obj.__dict__:
factory_method = new
# or an own '__init__' method
elif '__init__' in obj.__dict__:
factory_method = init
# If not, we take inherited '__new__' or '__init__', if present
elif new is not None:
factory_method = new
elif init is not None:
factory_method = init

# Go through the MRO and see if any class has user-defined
# pure Python __new__ or __init__ method
for base in obj.__mro__:
# Now we check if the 'obj' class has an own '__new__' method
if new is not None and '__new__' in base.__dict__:
factory_method = new
break
# or an own '__init__' method
elif init is not None and '__init__' in base.__dict__:
factory_method = init
break

if factory_method is not None:
sig = _get_signature_of(factory_method)
Expand Down
18 changes: 18 additions & 0 deletions Lib/test/test_inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -3688,6 +3688,24 @@ def foo(): pass
self.assertEqual(signature_func(foo), inspect.Signature())
self.assertEqual(inspect.get_annotations(foo), {})

def test_signature_on_derived_classes(self):
# gh-105080: Make sure that signatures are consistent on derived classes

class B:
def __new__(self, *args, **kwargs):
return super().__new__(self)
def __init__(self, value):
self.value = value

class D1(B):
def __init__(self, value):
super().__init__(value)

class D2(D1):
pass

self.assertEqual(inspect.signature(D2), inspect.signature(D1))


class TestParameterObject(unittest.TestCase):
def test_signature_parameter_kinds(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed inconsistent signature on derived classes for :func:`inspect.signature`

0 comments on commit aca77b5

Please sign in to comment.