diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-06-04 00:18:30 +0900 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-06-04 00:18:30 +0900 |
commit | 068b9b5738b4d41a25e14d56d6f6b55f3bc8d443 (patch) | |
tree | f58f2d43d8a54545ae8a0c51ffe99c310864710d /sphinx/util/inspect.py | |
parent | 88a3548a8268d3b99f2d79db08fe65da7d691592 (diff) | |
parent | 9b45b00bd4cee7dad96b98cec0224f88a84ef40a (diff) | |
download | sphinx-git-068b9b5738b4d41a25e14d56d6f6b55f3bc8d443.tar.gz |
Merge branch '3.x'
Diffstat (limited to 'sphinx/util/inspect.py')
-rw-r--r-- | sphinx/util/inspect.py | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 79efbeaf7..f1efeee2b 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -13,6 +13,7 @@ import enum import inspect import re import sys +import types import typing import warnings from functools import partial, partialmethod @@ -304,6 +305,18 @@ def isproperty(obj: Any) -> bool: return isinstance(obj, property) +def isgenericalias(obj: Any) -> bool: + """Check if the object is GenericAlias.""" + if (hasattr(typing, '_GenericAlias') and # only for py37+ + isinstance(obj, typing._GenericAlias)): # type: ignore + return True + elif (hasattr(types, 'GenericAlias') and # only for py39+ + isinstance(obj, types.GenericAlias)): # type: ignore + return True + else: + return False + + def safe_getattr(obj: Any, name: str, *defargs: Any) -> Any: """A getattr() that turns all exceptions into AttributeErrors.""" try: @@ -501,19 +514,34 @@ def signature_from_str(signature: str) -> inspect.Signature: # parameters args = definition.args + defaults = list(args.defaults) params = [] + if hasattr(args, "posonlyargs"): + posonlyargs = len(args.posonlyargs) # type: ignore + positionals = posonlyargs + len(args.args) + else: + posonlyargs = 0 + positionals = len(args.args) + + for _ in range(len(defaults), positionals): + defaults.insert(0, Parameter.empty) if hasattr(args, "posonlyargs"): - for arg in args.posonlyargs: # type: ignore + for i, arg in enumerate(args.posonlyargs): # type: ignore + if defaults[i] is Parameter.empty: + default = Parameter.empty + else: + default = ast_unparse(defaults[i]) + annotation = ast_unparse(arg.annotation) or Parameter.empty params.append(Parameter(arg.arg, Parameter.POSITIONAL_ONLY, - annotation=annotation)) + default=default, annotation=annotation)) for i, arg in enumerate(args.args): - if len(args.args) - i <= len(args.defaults): - default = ast_unparse(args.defaults[-len(args.args) + i]) - else: + if defaults[i + posonlyargs] is Parameter.empty: default = Parameter.empty + else: + default = ast_unparse(defaults[i + posonlyargs]) annotation = ast_unparse(arg.annotation) or Parameter.empty params.append(Parameter(arg.arg, Parameter.POSITIONAL_OR_KEYWORD, @@ -561,7 +589,7 @@ def getdoc(obj: Any, attrgetter: Callable = safe_getattr, # This tries to obtain the docstring from super classes. for basecls in getattr(cls, '__mro__', []): meth = safe_getattr(basecls, name, None) - if meth: + if meth is not None: doc = inspect.getdoc(meth) if doc: break |