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 = (

`