4

我正在尝试使用 Python 3 中的ast 模块来解析一些 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 函数)声明的参数:

arguments = (arg* args, identifier? vararg, expr? varargannotation,
                     arg* kwonlyargs, identifier? kwarg,
                     expr? kwargannotation, expr* defaults,
                     expr* kw_defaults)

我可以识别:

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

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

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

谢谢。

4

1 回答 1

0

老问题,但仍然开放。所以:

  • expr? returns用于函数的返回类型提示。例如

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

    在对象的字段中生成一个ast.Name实例。有关类型提示的更多信息,请参阅文档PEP 484id = 'str'resultFunctionDef

  • 正如评论中提到的,arg* kwonlyargs关键字参数,即出现在可变参数之后的关键字参数。(这背后的原因是,您可能希望定义一个同时接受可变数量参数和可选关键字参数的函数。出现在可变参数之前的 Kwarg 不能是可选的,因为您必须在在附加可变参数之前调用站点。)
  • expr* kw_defaults是每个 kwonlyarg 的默认值列表。如果 kwonlyarg 没有默认值,则它None在列表中由 表示。
于 2018-11-07T13:33:44.790 回答