mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Fix #8023: evaluate_signature() does not work properly in python3.10
Since 3.10, ForwardRef._evalute() takes an additional argument `recursive_guard`. As a result, sphinx.util.inspect:evaluate_signature() does not work properly. This adds a simple wrapper evalute_forwardref() to allow evaluating ForwardRefs in py3.10.
This commit is contained in:
parent
a443538e0c
commit
01ff500b34
@ -497,19 +497,26 @@ def signature(subject: Callable, bound_method: bool = False, follow_wrapped: boo
|
||||
def evaluate_signature(sig: inspect.Signature, globalns: Dict = None, localns: Dict = None
|
||||
) -> inspect.Signature:
|
||||
"""Evaluate unresolved type annotations in a signature object."""
|
||||
def evaluate_forwardref(ref: ForwardRef, globalns: Dict, localns: Dict) -> Any:
|
||||
"""Evaluate a forward reference."""
|
||||
if sys.version_info > (3, 10):
|
||||
return ref._evaluate(globalns, localns, frozenset())
|
||||
else:
|
||||
return ref._evaluate(globalns, localns)
|
||||
|
||||
def evaluate(annotation: Any, globalns: Dict, localns: Dict) -> Any:
|
||||
"""Evaluate unresolved type annotation."""
|
||||
try:
|
||||
if isinstance(annotation, str):
|
||||
ref = ForwardRef(annotation, True)
|
||||
annotation = ref._evaluate(globalns, localns)
|
||||
annotation = evaluate_forwardref(ref, globalns, localns)
|
||||
|
||||
if isinstance(annotation, ForwardRef):
|
||||
annotation = annotation._evaluate(globalns, localns)
|
||||
annotation = evaluate_forwardref(ref, globalns, localns)
|
||||
elif isinstance(annotation, str):
|
||||
# might be a ForwardRef'ed annotation in overloaded functions
|
||||
ref = ForwardRef(annotation, True)
|
||||
annotation = ref._evaluate(globalns, localns)
|
||||
annotation = evaluate_forwardref(ref, globalns, localns)
|
||||
except (NameError, TypeError):
|
||||
# failed to evaluate type. skipped.
|
||||
pass
|
||||
|
Loading…
Reference in New Issue
Block a user