背景
我有一个纯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
方法相同的问题。
在没有对映射进行硬编码的情况下,是否有一种优雅的方式?