summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/reprlib.py1
-rw-r--r--Lib/test/test_reprlib.py11
-rw-r--r--Misc/NEWS.d/next/Library/2023-09-25-09-59-59.gh-issue-109818.dLRtT-.rst2
3 files changed, 14 insertions, 0 deletions
diff --git a/Lib/reprlib.py b/Lib/reprlib.py
index a92b3e3..a7b3763 100644
--- a/Lib/reprlib.py
+++ b/Lib/reprlib.py
@@ -29,6 +29,7 @@ def recursive_repr(fillvalue='...'):
wrapper.__name__ = getattr(user_function, '__name__')
wrapper.__qualname__ = getattr(user_function, '__qualname__')
wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
+ wrapper.__type_params__ = getattr(user_function, '__type_params__', ())
return wrapper
return decorating_function
diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py
index e7216d4..4a896db 100644
--- a/Lib/test/test_reprlib.py
+++ b/Lib/test/test_reprlib.py
@@ -765,5 +765,16 @@ class TestRecursiveRepr(unittest.TestCase):
for name in assigned:
self.assertIs(getattr(wrapper, name), getattr(wrapped, name))
+ def test__type_params__(self):
+ class My:
+ @recursive_repr()
+ def __repr__[T: str](self, default: T = '') -> str:
+ return default
+
+ type_params = My().__repr__.__type_params__
+ self.assertEqual(len(type_params), 1)
+ self.assertEqual(type_params[0].__name__, 'T')
+ self.assertEqual(type_params[0].__bound__, str)
+
if __name__ == "__main__":
unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2023-09-25-09-59-59.gh-issue-109818.dLRtT-.rst b/Misc/NEWS.d/next/Library/2023-09-25-09-59-59.gh-issue-109818.dLRtT-.rst
new file mode 100644
index 0000000..184086a
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-09-25-09-59-59.gh-issue-109818.dLRtT-.rst
@@ -0,0 +1,2 @@
+Fix :func:`reprlib.recursive_repr` not copying ``__type_params__`` from
+decorated function.