summaryrefslogtreecommitdiff
path: root/sphinx/util/inspect.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/util/inspect.py')
-rw-r--r--sphinx/util/inspect.py19
1 files changed, 17 insertions, 2 deletions
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py
index ddf72f1a4..036bbc364 100644
--- a/sphinx/util/inspect.py
+++ b/sphinx/util/inspect.py
@@ -9,6 +9,7 @@
"""
import builtins
+import contextlib
import enum
import inspect
import re
@@ -18,7 +19,7 @@ import typing
import warnings
from functools import partial, partialmethod
from inspect import ( # NOQA
- Parameter, isclass, ismethod, ismethoddescriptor
+ Parameter, isclass, ismethod, ismethoddescriptor, ismodule
)
from io import StringIO
from typing import Any, Callable
@@ -404,6 +405,17 @@ def is_builtin_class_method(obj: Any, attr_name: str) -> bool:
return getattr(builtins, name, None) is cls
+def _should_unwrap(subject: Callable) -> bool:
+ """Check the function should be unwrapped on getting signature."""
+ if (safe_getattr(subject, '__globals__', None) and
+ subject.__globals__.get('__name__') == 'contextlib' and # type: ignore
+ subject.__globals__.get('__file__') == contextlib.__file__): # type: ignore
+ # contextmanger should be unwrapped
+ return True
+
+ return False
+
+
def signature(subject: Callable, bound_method: bool = False, follow_wrapped: bool = False
) -> inspect.Signature:
"""Return a Signature object for the given *subject*.
@@ -414,7 +426,10 @@ def signature(subject: Callable, bound_method: bool = False, follow_wrapped: boo
"""
try:
try:
- signature = inspect.signature(subject, follow_wrapped=follow_wrapped)
+ if _should_unwrap(subject):
+ signature = inspect.signature(subject)
+ else:
+ signature = inspect.signature(subject, follow_wrapped=follow_wrapped)
except ValueError:
# follow built-in wrappers up (ex. functools.lru_cache)
signature = inspect.signature(subject)