@@ -3005,6 +3005,56 @@ def static_func(arg: int) -> str:
30053005 self .assertEqual (A .static_func .__name__ , 'static_func' )
30063006 self .assertEqual (A ().static_func .__name__ , 'static_func' )
30073007
3008+ def test_method_classlevel_calls (self ):
3009+ """Regression test for GH-144615."""
3010+ class C :
3011+ @functools .singledispatchmethod
3012+ def generic (self , x : object ):
3013+ return "generic"
3014+
3015+ @generic .register
3016+ def special1 (self , x : int ):
3017+ return "special1"
3018+
3019+ @generic .register
3020+ @classmethod
3021+ def special2 (self , x : float ):
3022+ return "special2"
3023+
3024+ @generic .register
3025+ @staticmethod
3026+ def special3 (self , x : complex ):
3027+ return "special3"
3028+
3029+ def special4 (self , x ):
3030+ return "special4"
3031+
3032+ class D1 :
3033+ def __get__ (self , _ , owner ):
3034+ return lambda inst , x : owner .special4 (inst , x )
3035+
3036+ generic .register (D1 , D1 ())
3037+
3038+ def special5 (self , x ):
3039+ return "special5"
3040+
3041+ class D2 :
3042+ def __get__ (self , inst , owner ):
3043+ # Different instance bound to the returned method
3044+ # doesn't cause it to receive the original instance
3045+ # as a separate argument. Return a partial() to workaround.
3046+ return C ().special5
3047+
3048+ generic .register (D2 , D2 ())
3049+
3050+
3051+ self .assertEqual (C .generic (C (), "foo" ), "generic" )
3052+ self .assertEqual (C .generic (C (), 1 ), "special1" )
3053+ self .assertEqual (C .generic (C (), 2.0 ), "special2" )
3054+ self .assertEqual (C .generic (C (), 3j ), "special3" )
3055+ self .assertEqual (C .generic (C (), C .D1 ()), "special4" )
3056+ self .assertEqual (C .generic (C (), C .D2 ()), "special5" )
3057+
30083058 def test_method_repr (self ):
30093059 class Callable :
30103060 def __call__ (self , * args ):
0 commit comments