python - 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中运行导入语句?谢谢你。
解决方案
推荐阅读
- spartacus-storefront - ASM Get cart 发出两个 HTTP 请求,但未通过身份验证标头
- c - 如何在C中将逗号添加到char数组中
- laravel - Laravel 删除一条记录的路由
- python - 如何通过随机初始化权重从头开始训练 keras.applications 中给出的模型?
- c++ - 为什么 include 语句返回一个错误,基本上表明该语言 (C++) 存在错误?
- python - 在python datetime中,为什么第一个月'January' = 1,但'Monday',一周的第一天= 0?
- sql - 我无法让它按月显示信息。是 GROUP BY 还是我的 LOOP 搞砸了?
- python-3.x - python MVC,如何让函数不按按钮自动运行?
- javascript - 如何从 Twilio 函数将数据加载到 S3 存储桶中?
- java - 匕首/缺少绑定。没有@Provides-annotated 方法就不能提供输出器