refactor: use raw Type for type annotations

This commit is contained in:
Takeshi KOMIYA 2021-04-04 14:37:15 +09:00
parent f7a2e081c8
commit 1b0d4672a4
20 changed files with 68 additions and 69 deletions

View File

@ -443,7 +443,7 @@ class Sphinx:
self.events.disconnect(listener_id)
def emit(self, event: str, *args: Any,
allowed_exceptions: Tuple["Type[Exception]", ...] = ()) -> List:
allowed_exceptions: Tuple[Type[Exception], ...] = ()) -> List:
"""Emit *event* and pass *arguments* to the callback functions.
Return the return values of all callbacks as a list. Do not emit core
@ -460,7 +460,7 @@ class Sphinx:
return self.events.emit(event, *args, allowed_exceptions=allowed_exceptions)
def emit_firstresult(self, event: str, *args: Any,
allowed_exceptions: Tuple["Type[Exception]", ...] = ()) -> Any:
allowed_exceptions: Tuple[Type[Exception], ...] = ()) -> Any:
"""Emit *event* and pass *arguments* to the callback functions.
Return the result of the first callback that doesn't return ``None``.
@ -479,7 +479,7 @@ class Sphinx:
# registering addon parts
def add_builder(self, builder: "Type[Builder]", override: bool = False) -> None:
def add_builder(self, builder: Type["Builder"], override: bool = False) -> None:
"""Register a new builder.
:param builder: A builder class
@ -542,7 +542,7 @@ class Sphinx:
logger.debug('[app] adding event: %r', name)
self.events.add(name)
def set_translator(self, name: str, translator_class: "Type[nodes.NodeVisitor]",
def set_translator(self, name: str, translator_class: Type[nodes.NodeVisitor],
override: bool = False) -> None:
"""Register or override a Docutils translator class.
@ -561,7 +561,7 @@ class Sphinx:
"""
self.registry.add_translator(name, translator_class, override=override)
def add_node(self, node: "Type[Element]", override: bool = False,
def add_node(self, node: Type[Element], override: bool = False,
**kwargs: Tuple[Callable, Callable]) -> None:
"""Register a Docutils node class.
@ -605,7 +605,7 @@ class Sphinx:
docutils.register_node(node)
self.registry.add_translation_handlers(node, **kwargs)
def add_enumerable_node(self, node: "Type[Element]", figtype: str,
def add_enumerable_node(self, node: Type[Element], figtype: str,
title_getter: TitleGetter = None, override: bool = False,
**kwargs: Tuple[Callable, Callable]) -> None:
"""Register a Docutils node class as a numfig target.
@ -634,7 +634,7 @@ class Sphinx:
self.registry.add_enumerable_node(node, figtype, title_getter, override=override)
self.add_node(node, override=override, **kwargs)
def add_directive(self, name: str, cls: "Type[Directive]", override: bool = False) -> None:
def add_directive(self, name: str, cls: Type[Directive], override: bool = False) -> None:
"""Register a Docutils directive.
:param name: The name of directive
@ -724,7 +724,7 @@ class Sphinx:
role = roles.GenericRole(name, nodeclass)
docutils.register_role(name, role)
def add_domain(self, domain: "Type[Domain]", override: bool = False) -> None:
def add_domain(self, domain: Type[Domain], override: bool = False) -> None:
"""Register a domain.
:param domain: A domain class
@ -738,7 +738,7 @@ class Sphinx:
self.registry.add_domain(domain, override=override)
def add_directive_to_domain(self, domain: str, name: str,
cls: "Type[Directive]", override: bool = False) -> None:
cls: Type[Directive], override: bool = False) -> None:
"""Register a Docutils directive in a domain.
Like :meth:`add_directive`, but the directive is added to the domain
@ -775,7 +775,7 @@ class Sphinx:
"""
self.registry.add_role_to_domain(domain, name, role, override=override)
def add_index_to_domain(self, domain: str, index: "Type[Index]", override: bool = False
def add_index_to_domain(self, domain: str, index: Type[Index], override: bool = False
) -> None:
"""Register a custom index for a domain.
@ -793,7 +793,7 @@ class Sphinx:
self.registry.add_index_to_domain(domain, index)
def add_object_type(self, directivename: str, rolename: str, indextemplate: str = '',
parse_node: Callable = None, ref_nodeclass: "Type[TextElement]" = None,
parse_node: Callable = None, ref_nodeclass: Type[TextElement] = None,
objname: str = '', doc_field_types: List = [], override: bool = False
) -> None:
"""Register a new object type.
@ -860,7 +860,7 @@ class Sphinx:
override=override)
def add_crossref_type(self, directivename: str, rolename: str, indextemplate: str = '',
ref_nodeclass: "Type[TextElement]" = None, objname: str = '',
ref_nodeclass: Type[TextElement] = None, objname: str = '',
override: bool = False) -> None:
"""Register a new crossref object type.
@ -898,7 +898,7 @@ class Sphinx:
indextemplate, ref_nodeclass, objname,
override=override)
def add_transform(self, transform: "Type[Transform]") -> None:
def add_transform(self, transform: Type[Transform]) -> None:
"""Register a Docutils transform to be applied after parsing.
Add the standard docutils :class:`Transform` subclass *transform* to
@ -933,7 +933,7 @@ class Sphinx:
""" # NOQA
self.registry.add_transform(transform)
def add_post_transform(self, transform: "Type[Transform]") -> None:
def add_post_transform(self, transform: Type[Transform]) -> None:
"""Register a Docutils transform to be applied before writing.
Add the standard docutils :class:`Transform` subclass *transform* to
@ -1113,7 +1113,7 @@ class Sphinx:
self.registry.add_documenter(cls.objtype, cls)
self.add_directive('auto' + cls.objtype, AutodocDirective, override=override)
def add_autodoc_attrgetter(self, typ: "Type", getter: Callable[[Any, str, Any], Any]
def add_autodoc_attrgetter(self, typ: Type, getter: Callable[[Any, str, Any], Any]
) -> None:
"""Register a new ``getattr``-like function for the autodoc extension.
@ -1157,7 +1157,7 @@ class Sphinx:
"""
self.registry.add_source_suffix(suffix, filetype, override=override)
def add_source_parser(self, parser: "Type[Parser]", override: bool = False) -> None:
def add_source_parser(self, parser: Type[Parser], override: bool = False) -> None:
"""Register a parser class.
If *override* is True, the given *parser* is forcedly installed even if
@ -1172,7 +1172,7 @@ class Sphinx:
"""
self.registry.add_source_parser(parser, override=override)
def add_env_collector(self, collector: "Type[EnvironmentCollector]") -> None:
def add_env_collector(self, collector: Type[EnvironmentCollector]) -> None:
"""Register an environment collector class.
Refer to :ref:`collector-api`.

View File

@ -114,7 +114,7 @@ class Builder:
self.env.set_versioning_method(self.versioning_method,
self.versioning_compare)
def get_translator_class(self, *args: Any) -> "Type[nodes.NodeVisitor]":
def get_translator_class(self, *args: Any) -> Type[nodes.NodeVisitor]:
"""Return a class of translator."""
return self.app.registry.get_translator_class(self)

View File

@ -333,7 +333,7 @@ class StandaloneHTMLBuilder(Builder):
self.script_files.append(JavaScript(filename, **kwargs))
@property
def default_translator_class(self) -> "Type[nodes.NodeVisitor]": # type: ignore
def default_translator_class(self) -> Type[nodes.NodeVisitor]: # type: ignore
if not html5_ready or self.config.html4_writer:
return HTMLTranslator
else:

View File

@ -30,7 +30,7 @@ RemovedInNextVersionWarning = RemovedInSphinx50Warning
def deprecated_alias(modname: str, objects: Dict[str, object],
warning: "Type[Warning]", names: Dict[str, str] = {}) -> None:
warning: Type[Warning], names: Dict[str, str] = {}) -> None:
module = import_module(modname)
sys.modules[modname] = _ModuleWrapper( # type: ignore
module, modname, objects, warning, names)
@ -39,7 +39,7 @@ def deprecated_alias(modname: str, objects: Dict[str, object],
class _ModuleWrapper:
def __init__(self, module: Any, modname: str,
objects: Dict[str, object],
warning: "Type[Warning]",
warning: Type[Warning],
names: Dict[str, str]) -> None:
self._module = module
self._modname = modname
@ -67,7 +67,7 @@ class _ModuleWrapper:
class DeprecatedDict(dict):
"""A deprecated dict which warns on each access."""
def __init__(self, data: Dict, message: str, warning: "Type[Warning]") -> None:
def __init__(self, data: Dict, message: str, warning: Type[Warning]) -> None:
self.message = message
self.warning = warning
super().__init__(data)

View File

@ -1057,7 +1057,7 @@ class StandardDomain(Domain):
def get_enumerable_node_type(self, node: Node) -> str:
"""Get type of enumerable nodes."""
def has_child(node: Element, cls: "Type") -> bool:
def has_child(node: Element, cls: Type) -> bool:
return any(isinstance(child, cls) for child in node)
if isinstance(node, nodes.section):

View File

@ -62,7 +62,7 @@ class TocTreeCollector(EnvironmentCollector):
docname = app.env.docname
numentries = [0] # nonlocal again...
def traverse_in_section(node: Element, cls: "Type[N]") -> List[N]:
def traverse_in_section(node: Element, cls: Type[N]) -> List[N]:
"""Like traverse(), but stay within the same section."""
result: List[N] = []
if isinstance(node, cls):

View File

@ -79,7 +79,7 @@ class DocumenterBridge:
return self._reporter
def process_documenter_options(documenter: "Type[Documenter]", config: Config, options: Dict
def process_documenter_options(documenter: Type[Documenter], config: Config, options: Dict
) -> Options:
"""Recognize options of Documenter from user input."""
for name in AUTODOC_DEFAULT_OPTIONS:

View File

@ -178,7 +178,7 @@ class FakeDirective(DocumenterBridge):
super().__init__(env, None, Options(), 0, state)
def get_documenter(app: Sphinx, obj: Any, parent: Any) -> "Type[Documenter]":
def get_documenter(app: Sphinx, obj: Any, parent: Any) -> Type[Documenter]:
"""Get an autodoc.Documenter class suitable for documenting the given
object.

View File

@ -826,7 +826,7 @@ class GoogleDocstring:
colon,
"".join(after_colon).strip())
def _qualify_name(self, attr_name: str, klass: "Type") -> str:
def _qualify_name(self, attr_name: str, klass: Type) -> str:
if klass and '.' not in attr_name:
if attr_name.startswith('~'):
attr_name = attr_name[1:]

View File

@ -61,7 +61,7 @@ class SphinxBaseReader(standalone.Reader):
self._app = app # hold application object only for compatibility
self._env = app.env
def get_transforms(self) -> List["Type[Transform]"]:
def get_transforms(self) -> List[Type[Transform]]:
transforms = super().get_transforms() + self.transforms
# remove transforms which is not needed for Sphinx

View File

@ -16,14 +16,13 @@ import docutils.parsers.rst
from docutils import nodes
from docutils.parsers.rst import states
from docutils.statemachine import StringList
from docutils.transforms import Transform
from docutils.transforms.universal import SmartQuotes
from sphinx.deprecation import RemovedInSphinx50Warning
from sphinx.util.rst import append_epilog, prepend_prolog
if TYPE_CHECKING:
from docutils.transforms import Transform # NOQA
from sphinx.application import Sphinx
@ -70,7 +69,7 @@ class Parser(docutils.parsers.Parser):
class RSTParser(docutils.parsers.rst.Parser, Parser):
"""A reST parser for Sphinx."""
def get_transforms(self) -> List[Type["Transform"]]:
def get_transforms(self) -> List[Type[Transform]]:
"""Sphinx's reST parser replaces a transform class for smart-quotes by own's
refs: sphinx.io.SphinxStandaloneReader

View File

@ -122,7 +122,7 @@ class SphinxComponentRegistry:
#: additional transforms; list of transforms
self.transforms = [] # type: List[Type[Transform]]
def add_builder(self, builder: "Type[Builder]", override: bool = False) -> None:
def add_builder(self, builder: Type[Builder], override: bool = False) -> None:
logger.debug('[app] adding builder: %r', builder)
if not hasattr(builder, 'name'):
raise ExtensionError(__('Builder class %s has no "name" attribute') % builder)
@ -151,7 +151,7 @@ class SphinxComponentRegistry:
return self.builders[name](app)
def add_domain(self, domain: "Type[Domain]", override: bool = False) -> None:
def add_domain(self, domain: Type[Domain], override: bool = False) -> None:
logger.debug('[app] adding domain: %r', domain)
if domain.name in self.domains and not override:
raise ExtensionError(__('domain %s already registered') % domain.name)
@ -174,7 +174,7 @@ class SphinxComponentRegistry:
yield domain
def add_directive_to_domain(self, domain: str, name: str,
cls: "Type[Directive]", override: bool = False) -> None:
cls: Type[Directive], override: bool = False) -> None:
logger.debug('[app] adding directive to domain: %r', (domain, name, cls))
if domain not in self.domains:
raise ExtensionError(__('domain %s not yet registered') % domain)
@ -197,7 +197,7 @@ class SphinxComponentRegistry:
(name, domain))
roles[name] = role
def add_index_to_domain(self, domain: str, index: "Type[Index]",
def add_index_to_domain(self, domain: str, index: Type[Index],
override: bool = False) -> None:
logger.debug('[app] adding index to domain: %r', (domain, index))
if domain not in self.domains:
@ -209,7 +209,7 @@ class SphinxComponentRegistry:
indices.append(index)
def add_object_type(self, directivename: str, rolename: str, indextemplate: str = '',
parse_node: Callable = None, ref_nodeclass: "Type[TextElement]" = None,
parse_node: Callable = None, ref_nodeclass: Type[TextElement] = None,
objname: str = '', doc_field_types: List = [], override: bool = False
) -> None:
logger.debug('[app] adding object type: %r',
@ -233,7 +233,7 @@ class SphinxComponentRegistry:
object_types[directivename] = ObjType(objname or directivename, rolename)
def add_crossref_type(self, directivename: str, rolename: str, indextemplate: str = '',
ref_nodeclass: "Type[TextElement]" = None, objname: str = '',
ref_nodeclass: Type[TextElement] = None, objname: str = '',
override: bool = False) -> None:
logger.debug('[app] adding crossref type: %r',
(directivename, rolename, indextemplate, ref_nodeclass, objname))
@ -259,7 +259,7 @@ class SphinxComponentRegistry:
else:
self.source_suffix[suffix] = filetype
def add_source_parser(self, parser: "Type[Parser]", override: bool = False) -> None:
def add_source_parser(self, parser: Type[Parser], override: bool = False) -> None:
logger.debug('[app] adding search source_parser: %r', parser)
# create a map from filetype to parser
@ -270,13 +270,13 @@ class SphinxComponentRegistry:
else:
self.source_parsers[filetype] = parser
def get_source_parser(self, filetype: str) -> "Type[Parser]":
def get_source_parser(self, filetype: str) -> Type[Parser]:
try:
return self.source_parsers[filetype]
except KeyError as exc:
raise SphinxError(__('Source parser for %s not registered') % filetype) from exc
def get_source_parsers(self) -> Dict[str, "Type[Parser]"]:
def get_source_parsers(self) -> Dict[str, Type[Parser]]:
return self.source_parsers
def create_source_parser(self, app: "Sphinx", filename: str) -> Parser:
@ -286,7 +286,7 @@ class SphinxComponentRegistry:
parser.set_application(app)
return parser
def get_source_input(self, filetype: str) -> "Type[Input]":
def get_source_input(self, filetype: str) -> Type[Input]:
warnings.warn('SphinxComponentRegistry.get_source_input() is deprecated.',
RemovedInSphinx60Warning)
@ -299,14 +299,14 @@ class SphinxComponentRegistry:
except KeyError:
return None
def add_translator(self, name: str, translator: "Type[nodes.NodeVisitor]",
def add_translator(self, name: str, translator: Type[nodes.NodeVisitor],
override: bool = False) -> None:
logger.debug('[app] Change of translator for the %s builder.', name)
if name in self.translators and not override:
raise ExtensionError(__('Translator for %r already exists') % name)
self.translators[name] = translator
def add_translation_handlers(self, node: "Type[Element]",
def add_translation_handlers(self, node: Type[Element],
**kwargs: Tuple[Callable, Callable]) -> None:
logger.debug('[app] adding translation_handlers: %r, %r', node, kwargs)
for builder_name, handlers in kwargs.items():
@ -320,7 +320,7 @@ class SphinxComponentRegistry:
'function tuple: %r=%r') % (builder_name, handlers)
) from exc
def get_translator_class(self, builder: Builder) -> "Type[nodes.NodeVisitor]":
def get_translator_class(self, builder: Builder) -> Type[nodes.NodeVisitor]:
return self.translators.get(builder.name,
builder.default_translator_class)
@ -342,24 +342,24 @@ class SphinxComponentRegistry:
return translator
def add_transform(self, transform: "Type[Transform]") -> None:
def add_transform(self, transform: Type[Transform]) -> None:
logger.debug('[app] adding transform: %r', transform)
self.transforms.append(transform)
def get_transforms(self) -> List["Type[Transform]"]:
def get_transforms(self) -> List[Type[Transform]]:
return self.transforms
def add_post_transform(self, transform: "Type[Transform]") -> None:
def add_post_transform(self, transform: Type[Transform]) -> None:
logger.debug('[app] adding post transform: %r', transform)
self.post_transforms.append(transform)
def get_post_transforms(self) -> List["Type[Transform]"]:
def get_post_transforms(self) -> List[Type[Transform]]:
return self.post_transforms
def add_documenter(self, objtype: str, documenter: "Type[Documenter]") -> None:
def add_documenter(self, objtype: str, documenter: Type["Documenter"]) -> None:
self.documenters[objtype] = documenter
def add_autodoc_attrgetter(self, typ: "Type",
def add_autodoc_attrgetter(self, typ: Type,
attrgetter: Callable[[Any, str, Any], Any]) -> None:
self.autodoc_attrgettrs[typ] = attrgetter
@ -384,7 +384,7 @@ class SphinxComponentRegistry:
else:
self.latex_packages.append((name, options))
def add_enumerable_node(self, node: "Type[Node]", figtype: str,
def add_enumerable_node(self, node: Type[Node], figtype: str,
title_getter: TitleGetter = None, override: bool = False) -> None:
logger.debug('[app] adding enumerable node: (%r, %r, %r)', node, figtype, title_getter)
if node in self.enumerable_nodes and not override:

View File

@ -69,7 +69,7 @@ class XRefRole(ReferenceRole):
innernodeclass = nodes.literal # type: Type[TextElement]
def __init__(self, fix_parens: bool = False, lowercase: bool = False,
nodeclass: "Type[Element]" = None, innernodeclass: "Type[TextElement]" = None,
nodeclass: Type[Element] = None, innernodeclass: Type[TextElement] = None,
warn_dangling: bool = False) -> None:
self.fix_parens = fix_parens
self.lowercase = lowercase

View File

@ -510,7 +510,7 @@ class progress_message:
def __enter__(self) -> None:
logger.info(bold(self.message + '... '), nonl=True)
def __exit__(self, exc_type: "Type[Exception]", exc_value: Exception, traceback: Any) -> bool: # NOQA
def __exit__(self, exc_type: Type[Exception], exc_value: Exception, traceback: Any) -> bool: # NOQA
if isinstance(exc_value, SkipProgressMessage):
logger.info(__('skipped'))
if exc_value.args:

View File

@ -61,7 +61,7 @@ class Field:
self.bodyrolename = bodyrolename
def make_xref(self, rolename: str, domain: str, target: str,
innernode: "Type[TextlikeNode]" = addnodes.literal_emphasis,
innernode: Type[TextlikeNode] = addnodes.literal_emphasis,
contnode: Node = None, env: "BuildEnvironment" = None) -> Node:
if not rolename:
return contnode or innernode(target, target)
@ -73,7 +73,7 @@ class Field:
return refnode
def make_xrefs(self, rolename: str, domain: str, target: str,
innernode: "Type[TextlikeNode]" = addnodes.literal_emphasis,
innernode: Type[TextlikeNode] = addnodes.literal_emphasis,
contnode: Node = None, env: "BuildEnvironment" = None) -> List[Node]:
return [self.make_xref(rolename, domain, target, innernode, contnode, env)]

View File

@ -67,7 +67,7 @@ def is_directive_registered(name: str) -> bool:
return name in directives._directives # type: ignore
def register_directive(name: str, directive: "Type[Directive]") -> None:
def register_directive(name: str, directive: Type[Directive]) -> None:
"""Register a directive to docutils.
This modifies global state of docutils. So it is better to use this
@ -95,12 +95,12 @@ def unregister_role(name: str) -> None:
roles._roles.pop(name, None) # type: ignore
def is_node_registered(node: "Type[Element]") -> bool:
def is_node_registered(node: Type[Element]) -> bool:
"""Check the *node* is already registered."""
return hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__)
def register_node(node: "Type[Element]") -> None:
def register_node(node: Type[Element]) -> None:
"""Register a node to docutils.
This modifies global state of some visitors. So it is better to use this
@ -111,7 +111,7 @@ def register_node(node: "Type[Element]") -> None:
additional_nodes.add(node)
def unregister_node(node: "Type[Element]") -> None:
def unregister_node(node: Type[Element]) -> None:
"""Unregister a node from docutils.
This is inverse of ``nodes._add_nodes_class_names()``.
@ -182,7 +182,7 @@ class sphinx_domains:
def __enter__(self) -> None:
self.enable()
def __exit__(self, exc_type: "Type[Exception]", exc_value: Exception, traceback: Any) -> None: # NOQA
def __exit__(self, exc_type: Type[Exception], exc_value: Exception, traceback: Any) -> None: # NOQA
self.disable()
def enable(self) -> None:
@ -226,7 +226,7 @@ class sphinx_domains:
raise ElementLookupError
def lookup_directive(self, directive_name: str, language_module: ModuleType, document: nodes.document) -> Tuple[Optional["Type[Directive]"], List[system_message]]: # NOQA
def lookup_directive(self, directive_name: str, language_module: ModuleType, document: nodes.document) -> Tuple[Optional[Type[Directive]], List[system_message]]: # NOQA
try:
return self.lookup_domain_element('directive', directive_name)
except ElementLookupError:

View File

@ -20,7 +20,7 @@ import warnings
from functools import partial, partialmethod
from inspect import Parameter, isclass, ismethod, ismethoddescriptor, ismodule # NOQA
from io import StringIO
from typing import Any, Callable, Dict, Mapping, Optional, Sequence, Tuple, cast
from typing import Any, Callable, Dict, Mapping, Optional, Sequence, Tuple, Type, cast
from sphinx.deprecation import RemovedInSphinx50Warning
from sphinx.pycode.ast import ast # for py36-37
@ -175,7 +175,7 @@ def getglobals(obj: Any) -> Mapping[str, Any]:
return {}
def getmro(obj: Any) -> Tuple["Type", ...]:
def getmro(obj: Any) -> Tuple[Type, ...]:
"""Get __mro__ from given *obj* safely."""
__mro__ = safe_getattr(obj, '__mro__', None)
if isinstance(__mro__, tuple):

View File

@ -58,7 +58,7 @@ class NodeMatcher:
# => [<reference ...>, <reference ...>, ...]
"""
def __init__(self, *node_classes: "Type[Node]", **attrs: Any) -> None:
def __init__(self, *node_classes: Type[Node], **attrs: Any) -> None:
self.classes = node_classes
self.attrs = attrs

View File

@ -214,7 +214,7 @@ class FileAvoidWrite:
def __enter__(self) -> "FileAvoidWrite":
return self
def __exit__(self, exc_type: "Type[Exception]", exc_value: Exception, traceback: Any) -> bool: # NOQA
def __exit__(self, exc_type: Type[Exception], exc_value: Exception, traceback: Any) -> bool: # NOQA
self.close()
return True

View File

@ -12,7 +12,7 @@ import sys
import typing
from struct import Struct
from types import TracebackType
from typing import Any, Callable, Dict, Generator, List, Optional, Tuple, TypeVar, Union
from typing import Any, Callable, Dict, Generator, List, Optional, Tuple, Type, TypeVar, Union
from docutils import nodes
from docutils.parsers.rst.states import Inliner
@ -101,7 +101,7 @@ def is_system_TypeVar(typ: Any) -> bool:
return modname == 'typing' and isinstance(typ, TypeVar)
def restify(cls: Optional["Type"]) -> str:
def restify(cls: Optional[Type]) -> str:
"""Convert python class to a reST reference."""
from sphinx.util import inspect # lazy loading
@ -128,7 +128,7 @@ def restify(cls: Optional["Type"]) -> str:
return _restify_py36(cls)
def _restify_py37(cls: Optional["Type"]) -> str:
def _restify_py37(cls: Optional[Type]) -> str:
"""Convert python class to a reST reference."""
from sphinx.util import inspect # lazy loading
@ -183,7 +183,7 @@ def _restify_py37(cls: Optional["Type"]) -> str:
return ':obj:`%s.%s`' % (cls.__module__, cls.__name__)
def _restify_py36(cls: Optional["Type"]) -> str:
def _restify_py36(cls: Optional[Type]) -> str:
module = getattr(cls, '__module__', None)
if module == 'typing':
if getattr(cls, '_name', None):