@@ -590,17 +590,49 @@ def __call__(self, arg, /):
590
590
if category is None :
591
591
arg .__deprecated__ = msg
592
592
return arg
593
- elif isinstance (arg , type ):
593
+
594
+ def update_signature (original_func ):
595
+ # Ensure that the signature of the decorated callable matches the original one
596
+
597
+ def wrapper (func ):
598
+ import inspect
599
+
600
+ try :
601
+ original_signature = inspect .signature (original_func )
602
+ except ValueError :
603
+ pass
604
+ else :
605
+ signature = inspect .signature (func )
606
+ if signature != original_signature :
607
+ try :
608
+ func .__text_signature__ = str (original_signature )
609
+ except (AttributeError , TypeError ):
610
+ pass
611
+
612
+ return func
613
+
614
+ return wrapper
615
+
616
+ if isinstance (arg , type ):
594
617
import functools
595
618
from types import MethodType
596
619
597
620
original_new = arg .__new__
621
+ is_object_new = original_new is object .__new__
622
+ if is_object_new :
623
+ def wraps (wrapped ):
624
+ def identity (func ):
625
+ return func
626
+ return identity
627
+ else :
628
+ wraps = functools .wraps
598
629
599
- @functools .wraps (original_new )
630
+ @update_signature (arg )
631
+ @wraps (original_new )
600
632
def __new__ (cls , * args , ** kwargs ):
601
633
if cls is arg :
602
634
warn (msg , category = category , stacklevel = stacklevel + 1 )
603
- if original_new is not object . __new__ :
635
+ if not is_object_new :
604
636
return original_new (cls , * args , ** kwargs )
605
637
# Mirrors a similar check in object.__new__.
606
638
elif cls .__init__ is object .__init__ and (args or kwargs ):
@@ -616,15 +648,19 @@ def __new__(cls, *args, **kwargs):
616
648
if isinstance (original_init_subclass , MethodType ):
617
649
original_init_subclass = original_init_subclass .__func__
618
650
651
+ @update_signature (original_init_subclass )
619
652
@functools .wraps (original_init_subclass )
620
653
def __init_subclass__ (* args , ** kwargs ):
621
654
warn (msg , category = category , stacklevel = stacklevel + 1 )
622
655
return original_init_subclass (* args , ** kwargs )
623
656
624
657
arg .__init_subclass__ = classmethod (__init_subclass__ )
658
+
625
659
# Or otherwise, which likely means it's a builtin such as
626
660
# object's implementation of __init_subclass__.
627
661
else :
662
+
663
+ @update_signature (original_init_subclass )
628
664
@functools .wraps (original_init_subclass )
629
665
def __init_subclass__ (* args , ** kwargs ):
630
666
warn (msg , category = category , stacklevel = stacklevel + 1 )
@@ -639,6 +675,7 @@ def __init_subclass__(*args, **kwargs):
639
675
import functools
640
676
import inspect
641
677
678
+ @update_signature (arg )
642
679
@functools .wraps (arg )
643
680
def wrapper (* args , ** kwargs ):
644
681
warn (msg , category = category , stacklevel = stacklevel + 1 )
0 commit comments