From 31e07c75dd235f30d70760f8d0181364b466a7ef Mon Sep 17 00:00:00 2001 From: James <50501825+Gobot1234@users.noreply.github.com> Date: Sat, 17 Jul 2021 17:57:00 +0100 Subject: [PATCH 1/2] Add support for PEP 585 generics --- sphinx/util/typing.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sphinx/util/typing.py b/sphinx/util/typing.py index 4e1b184e0a..5c72d6f32d 100644 --- a/sphinx/util/typing.py +++ b/sphinx/util/typing.py @@ -310,6 +310,8 @@ def stringify(annotation: Any) -> str: return INVALID_BUILTIN_CLASSES[annotation] elif (getattr(annotation, '__module__', None) == 'builtins' and hasattr(annotation, '__qualname__')): + if hasattr(annotation, '__args__'): # PEP 585 generic + return repr(annotation) return annotation.__qualname__ elif annotation is Ellipsis: return '...' From 451811c40cd9918213a13591a6b8dcaab4287ed5 Mon Sep 17 00:00:00 2001 From: James Date: Sun, 18 Jul 2021 10:55:38 +0100 Subject: [PATCH 2/2] Respond to feedback --- sphinx/util/typing.py | 3 ++- tests/test_util_typing.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/sphinx/util/typing.py b/sphinx/util/typing.py index 5c72d6f32d..4450d4edb6 100644 --- a/sphinx/util/typing.py +++ b/sphinx/util/typing.py @@ -312,7 +312,8 @@ def stringify(annotation: Any) -> str: hasattr(annotation, '__qualname__')): if hasattr(annotation, '__args__'): # PEP 585 generic return repr(annotation) - return annotation.__qualname__ + else: + return annotation.__qualname__ elif annotation is Ellipsis: return '...' diff --git a/tests/test_util_typing.py b/tests/test_util_typing.py index 424715b39a..afa5384f7a 100644 --- a/tests/test_util_typing.py +++ b/tests/test_util_typing.py @@ -175,6 +175,18 @@ def test_stringify_type_hints_containers(): assert stringify(Generator[None, None, None]) == "Generator[None, None, None]" +@pytest.mark.skipif(sys.version_info < (3, 9), reason='python 3.9+ is required.') +def test_stringify_type_hints_pep_585(): + assert stringify(list[int]) == "list[int]" + assert stringify(list[str]) == "list[str]" + assert stringify(dict[str, float]) == "dict[str, float]" + assert stringify(tuple[str, str, str]) == "tuple[str, str, str]" + assert stringify(tuple[str, ...]) == "tuple[str, ...]" + assert stringify(tuple[()]) == "tuple[()]" + assert stringify(list[dict[str, tuple]]) == "list[dict[str, tuple]]" + assert stringify(type[int]) == "type[int]" + + @pytest.mark.skipif(sys.version_info < (3, 9), reason='python 3.9+ is required.') def test_stringify_Annotated(): from typing import Annotated # type: ignore