summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2016-04-09 17:24:34 +0300
committerAlex Grönholm <alex.gronholm@nextday.fi>2016-11-02 21:43:33 +0200
commita1f6baaa8183e32e39dedede577955a2765f5d96 (patch)
treeee850c3d0fb8fefa6ac4fc7a1d4a97d90138f452
parent0f35b9450010cd443205ed475c896b8a45697ef1 (diff)
downloadsphinx-git-a1f6baaa8183e32e39dedede577955a2765f5d96.tar.gz
Fix annotations formatting for plain typing.Callable
The typing.Callable class may be used without generic arguments, in which case it is equivalent to collections.abc.Callable.
-rw-r--r--sphinx/ext/autodoc.py2
-rw-r--r--tests/test_autodoc.py9
-rw-r--r--tests/typing_test_data.py9
3 files changed, 13 insertions, 7 deletions
diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py
index 148c09811..d3621e6db 100644
--- a/sphinx/ext/autodoc.py
+++ b/sphinx/ext/autodoc.py
@@ -313,7 +313,7 @@ def format_annotation(annotation):
return '%s[%s]' % (qualified_name, param_str)
elif hasattr(typing, 'CallableMeta') and \
isinstance(annotation, typing.CallableMeta) and \
- hasattr(annotation, '__args__') and \
+ getattr(annotation, '__args__', None) is not None and \
hasattr(annotation, '__result__'):
args = annotation.__args__
if args is Ellipsis:
diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py
index 2b5d80efb..d2ba95608 100644
--- a/tests/test_autodoc.py
+++ b/tests/test_autodoc.py
@@ -1069,7 +1069,7 @@ def test_type_hints():
from sphinx.util.inspect import getargspec
try:
- from typing_test_data import f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10
+ from typing_test_data import f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11
except (ImportError, SyntaxError):
raise SkipTest('Cannot import Python code with function annotations')
@@ -1104,10 +1104,11 @@ def test_type_hints():
# Callable types
verify_arg_spec(f8, '(x: typing.Callable[[int, str], int]) -> None')
+ verify_arg_spec(f9, '(x: typing.Callable) -> None')
# Tuple types
- verify_arg_spec(f9, '(x: typing.Tuple[int, str],'
- ' y: typing.Tuple[int, ...]) -> None')
+ verify_arg_spec(f10, '(x: typing.Tuple[int, str],'
+ ' y: typing.Tuple[int, ...]) -> None')
# Instance annotations
- verify_arg_spec(f10, '(x: CustomAnnotation, y: 123) -> None')
+ verify_arg_spec(f11, '(x: CustomAnnotation, y: 123) -> None')
diff --git a/tests/typing_test_data.py b/tests/typing_test_data.py
index beb8deebb..84bb3377b 100644
--- a/tests/typing_test_data.py
+++ b/tests/typing_test_data.py
@@ -48,7 +48,11 @@ def f8(x: Callable[[int, str], int]) -> None:
pass
-def f9(x: Tuple[int, str], y: Tuple[int, ...]) -> None:
+def f9(x: Callable) -> None:
+ pass
+
+
+def f10(x: Tuple[int, str], y: Tuple[int, ...]) -> None:
pass
@@ -56,5 +60,6 @@ class CustomAnnotation:
def __repr__(self):
return 'CustomAnnotation'
-def f10(x: CustomAnnotation(), y: 123) -> None:
+
+def f11(x: CustomAnnotation(), y: 123) -> None:
pass