首页 > 解决方案 > 部分导入:导入所有内容直至出错

问题描述

有没有办法执行非原子的python导入?

例如,我有一个文件如下:

# Filename: a.py
myvariable = 1
mylist = [1, 2, 3]
raise ImportError
donotimportthis = 5

然后我有一个单独的文件,它执行以下操作:

import a
a.myvariable == 1 # This is okay as it imported it
a.donotimportthis # <-- raise an exception as this is not imported.

我有一个包含一些 python 代码的文件,它遵循以下格式:

...variables...
import X

我没有安装 X,也不需要它,但我确实想要变量。注意:这个文件不是由我自动生成的,而是由一个版本被冻结的工具自动生成的。

标签: python

解决方案


两种选择,按偏好降序排列:

  1. 更改自动生成过程。而不是调用proprietary_autogen_process,调用custom_autogen_wrapper。这个包装器反过来首先调用专有的第三方工具,然后通过搜索导入模块的代码来修改生成的模块源代码X,并删除它之后的所有内容。

    这是相对简单的。您只需要注意不要通过对导入代码执行过于松散(或过于严格)的匹配来引入误报或误报。理想情况下,您会使用AST 重写器,但这可能有点矫枉过正;正则表达式搜索import X可能会起作用,但如果此文本出现在注释、字符串文字或未执行的方法中,它将产生错误的结果。

  2. 在导入后者时自动生成的模块可以找到的位置生成存根模块 X。我不建议这样做,因为它很乏味:您可能不能只生成一个空模块,因为自动生成的模块将要使用 X。您需要生成有意义的方法存根。


推荐阅读