【问题标题】:How to create a typed return using Python's ast? - `def f() -> bool: return True`如何使用 Python 的 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: 无效语法

【问题讨论】:

    标签: python function code-generation abstract-syntax-tree python-typing


    【解决方案1】:

    哦,我忘记访问它了

    这个:

    returns=parse('Union[bool, str]'),
    

    应该是:

    returns=parse('Union[bool, str]').body[0].value,
    

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2018-10-12
      • 2020-09-03
      • 2014-04-25
      • 1970-01-01
      相关资源
      最近更新 更多