2

我想在 python 中添加一个新功能,纯粹出于实验目的,我想扩展装饰器语法。目前装饰器可以应用于函数和类。我还想在循环(for例如循环)以及代码块上使用装饰器。

示例 1:

    @foo
    for i in range(20):
        # do something
        # and something more

示例 2:

    @foo
        # there's a block starting from an indent here.
        # there's some code now
        # do something
        # and something more

现在虽然这是基本思想,但我的要求是修改装饰器的主体。例如,我想根据应用于它的装饰器稍微更改循环。我可以为此使用 AST 模块。

问题是我不想完全添加新语法及其完整实现。我只想用新语法解析,访问解析树和装饰器的主体,对其进行操作并将其插入程序的主体,删除装饰器,从而将具有新语法的程序更改为 python 的语法马上。

关于我将如何做这件事的任何想法?

4

1 回答 1

2

如果不添加新语法,您将无法做到这一点。装饰者本身并没有这样的“身体”。装饰器可以应用于函数或类,仅此而已。请参阅http://docs.python.org/2/reference/grammar.html顶部附近:

decorated: decorators (classdef | funcdef)

如果你想要别的东西,它不能是一个装饰器,它必须是你自己的语法,看起来像一个装饰器。

您可以编写某种预处理器来解析您的语法并转换为有效的 Python。一种可能性是parser模块。它具有解析基本 Python 元素(如套件(即块))的工具。您可以在文档中看到一个简单的示例。该ast模块还提供此功能。但是这些模块没有提供一种独立于类/函数定义来解析装饰器的方法;装饰器本质上被视为类/函数定义的一部分。

即使您设法解析您的特定构造,您也可能不得不做大量的诡计来创建 AST。问题是您不能只“访问解析树”和“修改 AST”,因为您编写的程序不会有正常的 Python 解析树,因为它不能被解析为有效的 Python。因此,您必须尝试通过将您的自定义代码与普通的 Python 解析代码拼凑在一起来拼接您自己的 AST。

于 2013-11-09T09:02:37.440 回答