mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-119180: Add evaluate functions for type params and type aliases (#122212)
This commit is contained in:
parent
cbac8a3888
commit
ae192262ad
11 changed files with 385 additions and 159 deletions
|
@ -413,7 +413,16 @@ class _StringifierDict(dict):
|
|||
return fwdref
|
||||
|
||||
|
||||
def call_annotate_function(annotate, format, owner=None):
|
||||
def call_evaluate_function(evaluate, format, *, owner=None):
|
||||
"""Call an evaluate function. Evaluate functions are normally generated for
|
||||
the value of type aliases and the bounds, constraints, and defaults of
|
||||
type parameter objects.
|
||||
"""
|
||||
return call_annotate_function(evaluate, format, owner=owner, _is_evaluate=True)
|
||||
|
||||
|
||||
def call_annotate_function(annotate, format, *, owner=None,
|
||||
_is_evaluate=False):
|
||||
"""Call an __annotate__ function. __annotate__ functions are normally
|
||||
generated by the compiler to defer the evaluation of annotations. They
|
||||
can be called with any of the format arguments in the Format enum, but
|
||||
|
@ -459,8 +468,11 @@ def call_annotate_function(annotate, format, owner=None):
|
|||
closure = tuple(new_closure)
|
||||
else:
|
||||
closure = None
|
||||
func = types.FunctionType(annotate.__code__, globals, closure=closure)
|
||||
func = types.FunctionType(annotate.__code__, globals, closure=closure,
|
||||
argdefs=annotate.__defaults__, kwdefaults=annotate.__kwdefaults__)
|
||||
annos = func(Format.VALUE)
|
||||
if _is_evaluate:
|
||||
return annos if isinstance(annos, str) else repr(annos)
|
||||
return {
|
||||
key: val if isinstance(val, str) else repr(val)
|
||||
for key, val in annos.items()
|
||||
|
@ -511,7 +523,8 @@ def call_annotate_function(annotate, format, owner=None):
|
|||
closure = tuple(new_closure)
|
||||
else:
|
||||
closure = None
|
||||
func = types.FunctionType(annotate.__code__, globals, closure=closure)
|
||||
func = types.FunctionType(annotate.__code__, globals, closure=closure,
|
||||
argdefs=annotate.__defaults__, kwdefaults=annotate.__kwdefaults__)
|
||||
result = func(Format.VALUE)
|
||||
for obj in globals.stringifiers:
|
||||
obj.__class__ = ForwardRef
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue