summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2020-04-28 01:32:52 +0900
committerGitHub <noreply@github.com>2020-04-28 01:32:52 +0900
commita527c2ae302051d1b7a2807a740df756c77102d7 (patch)
treeb6aa61ebd48780e56b44e44a07ec93590b6a3220
parent955ff134ba0b9495ddf63e290d7d2b76accd4b27 (diff)
parent46372726de435cbc6b70c99d95b7986f76563df4 (diff)
downloadsphinx-git-a527c2ae302051d1b7a2807a740df756c77102d7.tar.gz
Merge pull request #7569 from eric-wieser/fix-bad-stringify
Do not emit type arguments twice
-rw-r--r--sphinx/util/typing.py9
-rw-r--r--tests/test_util_typing.py8
2 files changed, 14 insertions, 3 deletions
diff --git a/sphinx/util/typing.py b/sphinx/util/typing.py
index eb38d232c..4644b1378 100644
--- a/sphinx/util/typing.py
+++ b/sphinx/util/typing.py
@@ -75,8 +75,13 @@ def _stringify_py37(annotation: Any) -> str:
qualname = stringify(annotation.__origin__) # ex. Union
elif hasattr(annotation, '__qualname__'):
qualname = '%s.%s' % (module, annotation.__qualname__)
+ elif hasattr(annotation, '__origin__'):
+ # instantiated generic provided by a user
+ qualname = stringify(annotation.__origin__)
else:
- qualname = repr(annotation)
+ # we weren't able to extract the base type, appending arguments would
+ # only make them appear twice
+ return repr(annotation)
if getattr(annotation, '__args__', None):
if qualname == 'Union':
@@ -91,7 +96,7 @@ def _stringify_py37(annotation: Any) -> str:
return '%s[[%s], %s]' % (qualname, args, returns)
elif str(annotation).startswith('typing.Annotated'): # for py39+
return stringify(annotation.__args__[0])
- elif annotation._special:
+ elif getattr(annotation, '_special', False):
return qualname
else:
args = ', '.join(stringify(a) for a in annotation.__args__)
diff --git a/tests/test_util_typing.py b/tests/test_util_typing.py
index f6fd35fb0..41d2a19c2 100644
--- a/tests/test_util_typing.py
+++ b/tests/test_util_typing.py
@@ -10,7 +10,7 @@
import sys
from numbers import Integral
-from typing import Any, Dict, List, TypeVar, Union, Callable, Tuple, Optional
+from typing import Any, Dict, List, TypeVar, Union, Callable, Tuple, Optional, Generic
import pytest
@@ -24,6 +24,11 @@ class MyClass1:
class MyClass2(MyClass1):
__qualname__ = '<MyClass2>'
+T = TypeVar('T')
+
+class MyList(List[T]):
+ pass
+
def test_stringify():
assert stringify(int) == "int"
@@ -42,6 +47,7 @@ def test_stringify_type_hints_containers():
assert stringify(Tuple[str, str, str]) == "Tuple[str, str, str]"
assert stringify(Tuple[str, ...]) == "Tuple[str, ...]"
assert stringify(List[Dict[str, Tuple]]) == "List[Dict[str, Tuple]]"
+ assert stringify(MyList[Tuple[int, int]]) == "test_util_typing.MyList[Tuple[int, int]]"
@pytest.mark.skipif(sys.version_info < (3, 9), reason='python 3.9+ is required.')