mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
[3.11] gh-105080: Fixed inconsistent signature on derived classes (GH… (#105274)
This commit is contained in:
parent
86eab0807f
commit
aca77b5530
3 changed files with 31 additions and 11 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue