我正在尝试在 Python 中创建一个与 compile() 等效的函数,但也可以让我取回原始字符串。为了消除歧义,我们将这两个函数称为 comp() 和 decomp()。那是,
a = comp("2 * (3 + x)", "", "eval")
eval(a, dict(x=3)) # => 12
decomp(a) # => "2 * (3 + x)"
返回的字符串不必相同("2*(3+x)" 可以接受),但它必须基本相同("2 * x + 6" 不会)。
这是我尝试过的不起作用的方法:
- 在 compile 返回的代码对象上设置一个属性。您不能在代码对象上设置自定义属性。
- 子类化代码,以便我可以添加属性。代码不能被子类化。
- 设置 WeakKeyDictionary 将代码对象映射到原始字符串。代码对象不能被弱引用。
这是有效的方法,但有问题:
- 将文件名的原始代码字符串传递给 compile()。但是,我失去了在其中实际保留文件名的能力,我也想这样做。
- 保留将代码对象映射到字符串的真实字典。这会泄漏内存,尽管由于编译很少见,但对于我当前的用例来说是可以接受的。如果必须的话,我可能可以定期通过 gc.get_referrers 运行密钥并杀死死掉的密钥。