Add sphinx.util.inspect:isgenericalias()

This commit is contained in:
Takeshi KOMIYA 2020-05-30 18:42:35 +09:00
parent 9988d5ce26
commit e20f29e325
3 changed files with 31 additions and 0 deletions

View File

@ -13,6 +13,7 @@ import enum
import inspect import inspect
import re import re
import sys import sys
import types
import typing import typing
import warnings import warnings
from functools import partial, partialmethod from functools import partial, partialmethod
@ -304,6 +305,18 @@ def isproperty(obj: Any) -> bool:
return isinstance(obj, property) 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: def safe_getattr(obj: Any, name: str, *defargs: Any) -> Any:
"""A getattr() that turns all exceptions into AttributeErrors.""" """A getattr() that turns all exceptions into AttributeErrors."""
try: try:

View File

@ -0,0 +1,6 @@
from typing import List, Callable
#: A list of int
T = List[int]
C = Callable[[int], None] # a generic alias not having a doccomment

View File

@ -560,6 +560,18 @@ def test_isproperty(app):
assert inspect.isproperty(func) is False # function assert inspect.isproperty(func) is False # function
@pytest.mark.skipif(sys.version_info < (3, 7), reason='python 3.7+ is required.')
@pytest.mark.sphinx(testroot='ext-autodoc')
def test_isgenericalias(app):
from target.genericalias import C, T
from target.methods import Base
assert inspect.isgenericalias(C) is True
assert inspect.isgenericalias(T) is True
assert inspect.isgenericalias(object()) is False
assert inspect.isgenericalias(Base) is False
def test_unpartial(): def test_unpartial():
def func1(a, b, c): def func1(a, b, c):
pass pass