如何使用 Python 的 ast 创建类型化的返回? - `def f() -> bool: return True`
Posted
技术标签:
【中文标题】如何使用 Python 的 ast 创建类型化的返回? - `def f() -> bool: return True`【英文标题】:How to create a typed return using Python's ast? - `def f() -> bool: return True` 【发布时间】:2020-11-14 07:49:10 【问题描述】:如何使用内置的ast 库将PEP484 语法用于返回类型?
尝试:
from ast import parse, Name, Load, Constant, Expr, FunctionDef, arguments, arg
func_def_ast = FunctionDef(
args=arguments(
args=[
arg(annotation=Name(ctx=Load(), id='str'),
arg='is_chocolate', type_comment=None),
arg(annotation=Name(ctx=Load(), id='bool'),
arg='verbose', type_comment=None)
],
defaults=[Constant(kind=None, value=True)],
kwarg=arg(annotation=None, arg='extra_kwargs',
type_comment=None), kw_defaults=[],
kwonlyargs=[], posonlyargs=[], vararg=None
),
body=[Expr(value=Constant(kind=None,
value='Crazy hungry function'))
],
decorator_list=[], name='is_choco',
returns=parse('Union[bool, str]'),
type_comment=None
)
现在让我们使用astor 打印出来:
from astor import to_source
src = to_source(func_def_ast)
print(src)
在 Python 3.8.3 上提供以下内容:
def is_choco(is_chocolate: str, verbose: bool=True, **extra_kwargs) ->
Union[bool, str]:
"""Crazy hungry function"""
有效的 Python 要求 Union[bool, str]
与顶部位于同一行,否则您会得到:
def is_choco(is_chocolate: str, verbose: bool=True, **extra_kwargs) ->
^
SyntaxError
: 无效语法
【问题讨论】:
【参考方案1】:哦,我忘记访问它了
这个:
returns=parse('Union[bool, str]'),
应该是:
returns=parse('Union[bool, str]').body[0].value,
【讨论】:
以上是关于如何使用 Python 的 ast 创建类型化的返回? - `def f() -> bool: return True`的主要内容,如果未能解决你的问题,请参考以下文章