[3.11] gh-105080: Fixed inconsistent signature on derived classes (GH… (#105274)

This commit is contained in:
Tian Gao 2023-06-04 14:26:01 -07:00 committed by GitHub
parent 86eab0807f
commit aca77b5530
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 11 deletions

View file

@ -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)