访问已编译的Python模块的AST或符号表

时间:2013-10-19 05:19:53

标签: python python-2.7 module abstract-syntax-tree pyc

背景

我有一个纯Python模块,定义了一些标记:

foo = object()

# for backwards compatibility
bar = foo

我想获得object个实例和变量名之间的映射。为此,我导入模块并循环遍历变量:

signals = {}

for name, obj in vars(module).items():
    if type(obj) == object:
        signals[obj] = name

问题

不保留变量的顺序,因此bar最终会错误地替换映射中的foo

如何仅定义foo = object()而非bar = foo定义的变量?

有些有效的解决方案

我知道可以使用ast模块完成,但我的模块可能没有相应的.py文件,因此inspect.getsource(module)只返回pyc的内容文件。 ast.parse()不会解析它,我真的不想添加新的依赖项。

也可以通过symtable方法使用Symbol.is_referenced()模块完成此操作,但这会遇到与ast方法相同的问题。

在没有对映射进行硬编码的情况下,是否有一种优雅的方式?

0 个答案:

没有答案