相关疑难解决方法(0)

将 ast 节点转换为 python 对象

给定一个ast可以自行评估的节点,但对于ast.literal_eval例如列表理解来说不够文字

src = '[i**2 for i in range(10)]'
a = ast.parse(src)
Run Code Online (Sandbox Code Playgroud)

现在a.body[0]是一个ast.Expra.body[0].value一个ast.ListComp。我想获得eval(src)会产生的列表,但只给出了ast.Expr节点。

python abstract-syntax-tree

5
推荐指数
1
解决办法
2287
查看次数

什么是Python AST中的Expr?

我正在努力用Python动态生成代码.

为了解决这个问题,我编写了一个辅助方法,它接受一串Python代码并转储出AST.这是方法:

# I want print treated as a function, not a statement.
import __future__
pfcf = __future__.print_function.compiler_flag

from ast import dump, PyCF_ONLY_AST

def d(s):
    print(dump(compile(s, '<String>', 'exec', pfcf|PyCF_ONLY_AST))
Run Code Online (Sandbox Code Playgroud)

当我在一个简单的Hello World上运行此函数时,它会吐出以下内容(格式化以便于阅读):

d("print('Hello World!')")

Module(body=[Expr(value=Call(func=Name(id='print',
                                       ctx=Load()),
                             args=[Str(s='Hello World!')],
                             keywords=[],
                             starargs=None,
                             kwargs=None))])
Run Code Online (Sandbox Code Playgroud)

我能够动态生成这个代码并运行它 - 一切都很棒.

然后我试着动态生成

print(len('Hello World!'))
Run Code Online (Sandbox Code Playgroud)

应该很简单 - 只是另一个函数调用.这是我的代码动态生成的:

Module(body=[Expr(value=Call(func=Name(id='print',
                                       ctx=Load()),
                             args=[Expr(value=Call(func=Name(id='len',
                                                             ctx=Load()),
                                                   args=[Str(s='Hello World!')],
                                                   keywords=[],
                                                   starargs=None,
                                                   kwargs=None))],
                             keywords=[],
                             starargs=None,
                             kwargs=None))])
Run Code Online (Sandbox Code Playgroud)

但是,运行它不起作用.相反,我收到了这条消息:

TypeError: expected some sort of expr, but got <_ast.Expr object at 0x101812c10>
Run Code Online (Sandbox Code Playgroud)

所以我运行了前面提到的辅助方法,看看它会输出什么:

d("print(len('Hello World!')")

Module(body=[Expr(value=Call(func=Name(id='print',
                                       ctx=Load()),
                             args=[Call(func=Name(id='len', …
Run Code Online (Sandbox Code Playgroud)

python abstract-syntax-tree

4
推荐指数
1
解决办法
1793
查看次数

标签 统计

abstract-syntax-tree ×2

python ×2