背景:
我有一个纯 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
在映射中错误地替换。
如何仅获取定义为 likefoo = object()
而不是的变量bar = foo
?
有点工作的解决方案:
我知道可以用ast
模块来完成,但是我的模块可能没有对应的.py
文件,所以inspect.getsource(module)
只返回pyc
文件的内容。ast.parse()
不会解析它,我也不想添加新的依赖项。
也可以symtable
通过该方法使用模块来完成Symbol.is_referenced()
,但这与该方法存在相同的问题ast
。
有没有一种优雅的方法可以在不对映射进行硬编码的情况下做到这一点?