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

访问已编译的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 问题: 变量的顺序没有保留,因此

背景:

我有一个纯Python模块,它定义了几个Sentinel:

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
方法存在相同的问题

有没有一种不需要硬编码映射的优雅方法