From a1f6baaa8183e32e39dedede577955a2765f5d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gr=C3=B6nholm?= Date: Sat, 9 Apr 2016 17:24:34 +0300 Subject: [PATCH] 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. --- sphinx/ext/autodoc.py | 2 +- tests/test_autodoc.py | 9 +++++---- tests/typing_test_data.py | 9 +++++++-- 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