bpo-32380: Create functools.singledispatchmethod (#6306) · python/cpython@c651275 (original) (raw)
`@@ -2147,6 +2147,124 @@ def eq(self, other):
`
2147
2147
`return self.arg == other
`
2148
2148
`self.assertEqual(i("str"), "str")
`
2149
2149
``
``
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
+
2150
2268
`def test_invalid_registrations(self):
`
2151
2269
`` msg_prefix = "Invalid first argument to register()
: "
``
2152
2270
`msg_suffix = (
`