@@ -2147,6 +2147,124 @@ def __eq__(self, other):
21472147 return self .arg == other
21482148 self .assertEqual (i ("str" ), "str" )
21492149
2150+ def test_method_register (self ):
2151+ class A :
2152+ @functools .singledispatchmethod
2153+ def t (self , arg ):
2154+ self .arg = "base"
2155+ @t .register (int )
2156+ def _ (self , arg ):
2157+ self .arg = "int"
2158+ @t .register (str )
2159+ def _ (self , arg ):
2160+ self .arg = "str"
2161+ a = A ()
2162+
2163+ a .t (0 )
2164+ self .assertEqual (a .arg , "int" )
2165+ aa = A ()
2166+ self .assertFalse (hasattr (aa , 'arg' ))
2167+ a .t ('' )
2168+ self .assertEqual (a .arg , "str" )
2169+ aa = A ()
2170+ self .assertFalse (hasattr (aa , 'arg' ))
2171+ a .t (0.0 )
2172+ self .assertEqual (a .arg , "base" )
2173+ aa = A ()
2174+ self .assertFalse (hasattr (aa , 'arg' ))
2175+
2176+ def test_staticmethod_register (self ):
2177+ class A :
2178+ @functools .singledispatchmethod
2179+ @staticmethod
2180+ def t (arg ):
2181+ return arg
2182+ @t .register (int )
2183+ @staticmethod
2184+ def _ (arg ):
2185+ return isinstance (arg , int )
2186+ @t .register (str )
2187+ @staticmethod
2188+ def _ (arg ):
2189+ return isinstance (arg , str )
2190+ a = A ()
2191+
2192+ self .assertTrue (A .t (0 ))
2193+ self .assertTrue (A .t ('' ))
2194+ self .assertEqual (A .t (0.0 ), 0.0 )
2195+
2196+ def test_classmethod_register (self ):
2197+ class A :
2198+ def __init__ (self , arg ):
2199+ self .arg = arg
2200+
2201+ @functools .singledispatchmethod
2202+ @classmethod
2203+ def t (cls , arg ):
2204+ return cls ("base" )
2205+ @t .register (int )
2206+ @classmethod
2207+ def _ (cls , arg ):
2208+ return cls ("int" )
2209+ @t .register (str )
2210+ @classmethod
2211+ def _ (cls , arg ):
2212+ return cls ("str" )
2213+
2214+ self .assertEqual (A .t (0 ).arg , "int" )
2215+ self .assertEqual (A .t ('' ).arg , "str" )
2216+ self .assertEqual (A .t (0.0 ).arg , "base" )
2217+
2218+ def test_callable_register (self ):
2219+ class A :
2220+ def __init__ (self , arg ):
2221+ self .arg = arg
2222+
2223+ @functools .singledispatchmethod
2224+ @classmethod
2225+ def t (cls , arg ):
2226+ return cls ("base" )
2227+
2228+ @A .t .register (int )
2229+ @classmethod
2230+ def _ (cls , arg ):
2231+ return cls ("int" )
2232+ @A .t .register (str )
2233+ @classmethod
2234+ def _ (cls , arg ):
2235+ return cls ("str" )
2236+
2237+ self .assertEqual (A .t (0 ).arg , "int" )
2238+ self .assertEqual (A .t ('' ).arg , "str" )
2239+ self .assertEqual (A .t (0.0 ).arg , "base" )
2240+
2241+ def test_abstractmethod_register (self ):
2242+ class Abstract (abc .ABCMeta ):
2243+
2244+ @functools .singledispatchmethod
2245+ @abc .abstractmethod
2246+ def add (self , x , y ):
2247+ pass
2248+
2249+ self .assertTrue (Abstract .add .__isabstractmethod__ )
2250+
2251+ def test_type_ann_register (self ):
2252+ class A :
2253+ @functools .singledispatchmethod
2254+ def t (self , arg ):
2255+ return "base"
2256+ @t .register
2257+ def _ (self , arg : int ):
2258+ return "int"
2259+ @t .register
2260+ def _ (self , arg : str ):
2261+ return "str"
2262+ a = A ()
2263+
2264+ self .assertEqual (a .t (0 ), "int" )
2265+ self .assertEqual (a .t ('' ), "str" )
2266+ self .assertEqual (a .t (0.0 ), "base" )
2267+
21502268 def test_invalid_registrations (self ):
21512269 msg_prefix = "Invalid first argument to `register()`: "
21522270 msg_suffix = (
0 commit comments