From adabdbeec700178e5b23c094cb8564f5d45d11ae Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sat, 30 Oct 2021 13:14:32 +0100 Subject: [PATCH 1/2] bpo-45678: Add ``functools.singledispatchmethod`` tests --- Lib/test/test_functools.py | 42 ++++++++++++++++++- .../2021-10-30-13-12-20.bpo-45678.bKrYeS.rst | 2 + 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index bdb4ddcc60cac2..1a3c921509d5e5 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -2411,7 +2411,7 @@ def _(cls, arg): self.assertEqual(A.t(0.0).arg, "base") def test_abstractmethod_register(self): - class Abstract(abc.ABCMeta): + class Abstract(metaclass=abc.ABCMeta): @functools.singledispatchmethod @abc.abstractmethod @@ -2419,6 +2419,10 @@ def add(self, x, y): pass self.assertTrue(Abstract.add.__isabstractmethod__) + self.assertTrue(Abstract.__dict__['add'].__isabstractmethod__) + + with self.assertRaises(TypeError): + Abstract() def test_type_ann_register(self): class A: @@ -2479,6 +2483,42 @@ def _(cls, arg: str): self.assertEqual(A.t('').arg, "str") self.assertEqual(A.t(0.0).arg, "base") + def test_method_wrapping_attributes(self): + class A: + @functools.singledispatchmethod + def func(self, arg: int) -> str: + """My function docstring""" + return str(arg) + @functools.singledispatchmethod + @classmethod + def cls_func(cls, arg: int) -> str: + """My function docstring""" + return str(arg) + @functools.singledispatchmethod + @staticmethod + def static_func(arg: int) -> str: + """My function docstring""" + return str(arg) + + for meth in ( + A.func, + A().func, + A.cls_func, + A().cls_func, + A.static_func, + A().static_func + ): + with self.subTest(meth=meth): + self.assertEqual(meth.__doc__, 'My function docstring') + self.assertEqual(meth.__annotations__['arg'], int) + + self.assertEqual(A.func.__name__, 'func') + self.assertEqual(A().func.__name__, 'func') + self.assertEqual(A.cls_func.__name__, 'cls_func') + self.assertEqual(A().cls_func.__name__, 'cls_func') + self.assertEqual(A.static_func.__name__, 'static_func') + self.assertEqual(A().static_func.__name__, 'static_func') + def test_invalid_registrations(self): msg_prefix = "Invalid first argument to `register()`: " msg_suffix = ( diff --git a/Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst b/Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst new file mode 100644 index 00000000000000..ddcf1614418766 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst @@ -0,0 +1,2 @@ +Add tests to ensure that `functools.singledispatchmethod` correctly wraps +the attributes of the target function. From 3767676680693f1cfcd4321e70952859d687a445 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sat, 30 Oct 2021 13:46:09 +0100 Subject: [PATCH 2/2] Update 2021-10-30-13-12-20.bpo-45678.bKrYeS.rst --- Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst b/Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst index ddcf1614418766..885b2fa64ad0fd 100644 --- a/Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst +++ b/Misc/NEWS.d/next/Tests/2021-10-30-13-12-20.bpo-45678.bKrYeS.rst @@ -1,2 +1,2 @@ -Add tests to ensure that `functools.singledispatchmethod` correctly wraps +Add tests to ensure that ``functools.singledispatchmethod`` correctly wraps the attributes of the target function.