访问已编译的Python模块';s AST或符号表
背景: 我有一个纯Python模块,它定义了几个Sentinel:访问已编译的Python模块';s AST或符号表,python,python-2.7,module,abstract-syntax-tree,pyc,Python,Python 2.7,Module,Abstract Syntax Tree,Pyc,背景: 我有一个纯Python模块,它定义了几个Sentinel: foo = object() # for backwards compatibility bar = foo 我想得到对象实例和变量名之间的映射。为此,我导入模块并循环变量: signals = {} for name, obj in vars(module).items(): if type(obj) == object: signals[obj] = name 问题: 变量的顺序没有保留,因此
foo = object()
# for backwards compatibility
bar = foo
我想得到对象
实例和变量名之间的映射。为此,我导入模块并循环变量:
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\u referenced()
方法来完成,但这与ast
方法存在相同的问题
有没有一种不需要硬编码映射的优雅方法