@@ -2903,9 +2903,9 @@ def method(self) -> None:
2903
2903
return arg
2904
2904
2905
2905
2906
- # Python 3.13.3+ contains a fix for the wrapped __new__
2907
- # Breakpoint: https://github.com/python/cpython/pull/132160
2908
- if sys .version_info >= (3 , 13 , 3 ):
2906
+ # Python 3.13.8+ and 3.14.1+ contain a fix for the wrapped __init_subclass__
2907
+ # Breakpoint: https://github.com/python/cpython/pull/138210
2908
+ if (( 3 , 13 , 8 ) <= sys .version_info < ( 3 , 14 )) or sys . version_info >= (3 , 14 , 1 ):
2909
2909
deprecated = warnings .deprecated
2910
2910
else :
2911
2911
_T = typing .TypeVar ("_T" )
@@ -2998,27 +2998,27 @@ def __new__(cls, /, *args, **kwargs):
2998
2998
2999
2999
arg .__new__ = staticmethod (__new__ )
3000
3000
3001
- original_init_subclass = arg .__init_subclass__
3002
- # We need slightly different behavior if __init_subclass__
3003
- # is a bound method (likely if it was implemented in Python)
3004
- if isinstance (original_init_subclass , MethodType ):
3005
- original_init_subclass = original_init_subclass .__func__
3001
+ if "__init_subclass__" in arg .__dict__ :
3002
+ # __init_subclass__ is directly present on the decorated class.
3003
+ # Synthesize a wrapper that calls this method directly.
3004
+ original_init_subclass = arg .__init_subclass__
3005
+ # We need slightly different behavior if __init_subclass__
3006
+ # is a bound method (likely if it was implemented in Python).
3007
+ # Otherwise, it likely means it's a builtin such as
3008
+ # object's implementation of __init_subclass__.
3009
+ if isinstance (original_init_subclass , MethodType ):
3010
+ original_init_subclass = original_init_subclass .__func__
3006
3011
3007
3012
@functools .wraps (original_init_subclass )
3008
3013
def __init_subclass__ (* args , ** kwargs ):
3009
3014
warnings .warn (msg , category = category , stacklevel = stacklevel + 1 )
3010
3015
return original_init_subclass (* args , ** kwargs )
3011
-
3012
- arg .__init_subclass__ = classmethod (__init_subclass__ )
3013
- # Or otherwise, which likely means it's a builtin such as
3014
- # object's implementation of __init_subclass__.
3015
3016
else :
3016
- @functools .wraps (original_init_subclass )
3017
- def __init_subclass__ (* args , ** kwargs ):
3017
+ def __init_subclass__ (cls , * args , ** kwargs ):
3018
3018
warnings .warn (msg , category = category , stacklevel = stacklevel + 1 )
3019
- return original_init_subclass (* args , ** kwargs )
3019
+ return super ( arg , cls ). __init_subclass__ (* args , ** kwargs )
3020
3020
3021
- arg .__init_subclass__ = __init_subclass__
3021
+ arg .__init_subclass__ = classmethod ( __init_subclass__ )
3022
3022
3023
3023
arg .__deprecated__ = __new__ .__deprecated__ = msg
3024
3024
__init_subclass__ .__deprecated__ = msg
0 commit comments