Python中AST的抽象语法:“FunctionDef”和“arguments”的问题

2024-04-26 04:27:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用python3中的ast module来解析一些Python代码。 现在我只编写一个简单的节点访问者,它将输出原始代码。在

我很难将AST的一些节点转换成实际的代码。在

关于http://docs.python.org/3.2/library/ast.html#abstract-grammar的语法,我不明白expr? returns应该是什么

FunctionDef(identifier name, arguments args,
            stmt* body, expr* decorator_list, expr? returns)

查看完整的Python语法(http://docs.python.org/3.2/reference/grammar.html)并不能帮助我理解可选元素可能是什么。在

同样,对于函数(或lambda函数)声明的参数:

^{pr2}$

我可以确定:

  • arg* argsexpr* defaults:“基本”参数及其默认值
  • identifier? varargexpr? varargannotation:用于捕获可变数量的参数(+注释),例如def f(first, *others : 'annotation'):
  • identifier? kwargexpr? kwargannotation:命名参数也是一样的

但我不知道什么是arg* kwonlyargsexpr* kw_defaults

我正在寻找一些使用这三个特性的示例代码,以便我能够理解它们的含义/用途。在

谢谢。在


Tags: 函数代码orghttpdocs参数节点html
1条回答
网友
1楼 · 发布于 2024-04-26 04:27:28

老问题,但仍然悬而未决。所以:

  • expr? returns用于函数的返回类型提示。E、 g

    def greeting(name) -> str:
        return 'Hello ' + name
    

    结果是一个ast.Name实例,其中id = 'str'位于FunctionDef对象的result字段中。有关类型提示的更多信息,请参见documentationPEP 484

  • 正如注释中提到的,arg* kwonlyargskeyword-only arguments,即出现在varargs之后的关键字参数。(这背后的原因是,您可能希望定义一个同时接受可变数量参数和可选关键字参数的函数。出现在varargs之前的kwarg不能是可选的,因为在附加vararg之前,必须在调用站点上显式指定所有这些参数。)
  • expr* kw_defaults是每个kwonlyarg的默认值列表。如果一个kwonlyarg没有默认值,它在列表中用None表示。在

相关问题 更多 >