1

背景:

我有一个纯 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

有没有一种优雅的方法可以在不对映射进行硬编码的情况下做到这一点?

4

0 回答 0