如何使用 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`的主要内容,如果未能解决你的问题,请参考以下文章

Python的ast模块

python3.3 上的烧瓶:“TypeError:AST 标识符必须是 str 类型”

使用类型参数在AST上播放-json

python 使用此示例来学习如何使用ast修改函数体

我可以从 cppyy 获取 AST

python 内置函数 compile()