我想在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具有的语法现在。
关于我将如何做到这一点的任何想法?
答案 0 :(得分:2)
如果不添加新语法,则无法执行此操作。装饰者本身没有这样的“身体”。装饰器可以应用于函数或类,就是这样。请参阅http://docs.python.org/2/reference/grammar.html顶部附近:
decorated: decorators (classdef | funcdef)
如果你想要别的东西,它不能是装饰者,它必须是你自己的语法,看起来像装饰者。
您可以编写某种预处理器来解析语法并转换为有效的Python。一种可能性是parser
module。它具有解析基本Python元素(如套件(即块))的功能。您可以在文档中看到一个简单的示例。 ast
模块也提供此功能。但是这些模块没有提供一种独立于类/函数defs解析装饰器的方法;装饰器基本上被认为是类/函数定义的一部分。
即使你设法解析你的特定构造,你也可能需要做大量的技巧来创建AST。问题是你不能只是“访问解析树”和“修改AST”,因为你编写的程序没有普通的Python解析树,因为它不能被解析为有效的Python。因此,您必须尝试通过将自定义代码与普通的Python解析代码拼接在一起来拼接您自己的AST。