首页 > 解决方案 > Python AST 不使用导入的模块

问题描述

我最近一直在使用 Python 的 AST(抽象语法树)模块,但遇到了一个问题,它似乎没有运行 import 语句。我找不到有关此的任何信息,我不确定发生了什么。

解释

当使用 AST 解析 .py 文件,然后编译/运行树时,树中的 import 语句似乎被忽略了,有利于脚本中进行解析的语句。

例子

这是该问题的最小工作示例。由扩展的 AST 文档制成

测试.py

from random import choice

def ast_broken_demo():
    lis = ["foo", "bar"]
    print(choice(lis))

ast_broken_demo()

解析器.py

import ast
#from random import choice

def main():
    path = "test.py"
    source_code = open(path).read()

    a = ast.parse(source_code)
    ast.fix_missing_locations(a)
    co = compile(a, '<ast>', 'exec')
    print(ast.dump(a))
    exec(co)

main()

这会导致错误消息:

 Traceback (most recent call last): 
 File "test.py", line 18, in <module>
   main()   
 File "test.py", line 16, in main
   exec(co)   
 File "<ast>", line 19, in <module>   
 File "<ast>", line 17, in ast_broken_demo 
 NameError: name 'choice' is not defined

如果您将其放在parser.pyfrom random import choice的顶部,这将解决,但我不应该这样做,因为该确切的行在test.py中并且应该在 AST 运行时执行。将导入放在parser.py中特别糟糕,因为解析器应该解析任何任意 .py 文件,所以我不可能导入任何人可能使用的所有内容。

这里发生了什么?为什么解析使用错误的导入或没有在test.py中运行导入语句?谢谢你。

标签: pythonpython-importabstract-syntax-tree

解决方案


推荐阅读