Skip to content

Commit 531de96

Browse files
AlexWaygoodmiss-islington
authored andcommitted
bpo-45678: Add functools.singledispatchmethod tests (pythonGH-29328)
(cherry picked from commit 5a14929) Co-authored-by: Alex Waygood <[email protected]>
1 parent 3a93c66 commit 531de96

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

Lib/test/test_functools.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2401,14 +2401,18 @@ def _(cls, arg):
24012401
self.assertEqual(A.t(0.0).arg, "base")
24022402

24032403
def test_abstractmethod_register(self):
2404-
class Abstract(abc.ABCMeta):
2404+
class Abstract(metaclass=abc.ABCMeta):
24052405

24062406
@functools.singledispatchmethod
24072407
@abc.abstractmethod
24082408
def add(self, x, y):
24092409
pass
24102410

24112411
self.assertTrue(Abstract.add.__isabstractmethod__)
2412+
self.assertTrue(Abstract.__dict__['add'].__isabstractmethod__)
2413+
2414+
with self.assertRaises(TypeError):
2415+
Abstract()
24122416

24132417
def test_type_ann_register(self):
24142418
class A:
@@ -2469,6 +2473,42 @@ def _(cls, arg: str):
24692473
self.assertEqual(A.t('').arg, "str")
24702474
self.assertEqual(A.t(0.0).arg, "base")
24712475

2476+
def test_method_wrapping_attributes(self):
2477+
class A:
2478+
@functools.singledispatchmethod
2479+
def func(self, arg: int) -> str:
2480+
"""My function docstring"""
2481+
return str(arg)
2482+
@functools.singledispatchmethod
2483+
@classmethod
2484+
def cls_func(cls, arg: int) -> str:
2485+
"""My function docstring"""
2486+
return str(arg)
2487+
@functools.singledispatchmethod
2488+
@staticmethod
2489+
def static_func(arg: int) -> str:
2490+
"""My function docstring"""
2491+
return str(arg)
2492+
2493+
for meth in (
2494+
A.func,
2495+
A().func,
2496+
A.cls_func,
2497+
A().cls_func,
2498+
A.static_func,
2499+
A().static_func
2500+
):
2501+
with self.subTest(meth=meth):
2502+
self.assertEqual(meth.__doc__, 'My function docstring')
2503+
self.assertEqual(meth.__annotations__['arg'], int)
2504+
2505+
self.assertEqual(A.func.__name__, 'func')
2506+
self.assertEqual(A().func.__name__, 'func')
2507+
self.assertEqual(A.cls_func.__name__, 'cls_func')
2508+
self.assertEqual(A().cls_func.__name__, 'cls_func')
2509+
self.assertEqual(A.static_func.__name__, 'static_func')
2510+
self.assertEqual(A().static_func.__name__, 'static_func')
2511+
24722512
def test_invalid_registrations(self):
24732513
msg_prefix = "Invalid first argument to `register()`: "
24742514
msg_suffix = (
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Add tests to ensure that ``functools.singledispatchmethod`` correctly wraps
2+
the attributes of the target function.

0 commit comments

Comments
 (0)