Cython:使用globals()。update(...)?

时间:2015-02-20 22:05:48

标签: python cython opcodes

我正在为以前拥有Cython工具链的模块编写Python字节码优化器。虽然现在可能已经弃用了,但是在摆弄它时我遇到了一些奇怪的事情。考虑一下这段简单的代码:

from opcode import opmap

globals().update(opmap)

print(STORE_GLOBAL)

这应打印97,因为STORE_GLOBALopmap中定义了其操作码(为97)。 Cython会告诉我STORE_GLOBAL没有定义,但是:

Error compiling Cython file:
------------------------------------------------------------
...
from opcode import opmap

globals().update(opmap)

print(STORE_GLOBAL)
                 ^
------------------------------------------------------------

test.py:5:18: undeclared name not builtin: STORE_GLOBAL

我猜,原因很简单。我假设它没有更新全局变量,所以它不知道STORE_GLOBAL现在是变量。

是否有一种解决这个问题的不幸方法?

干杯

2 个答案:

答案 0 :(得分:2)

原因是虽然cython模块有一个在python中公开的全局命名空间,但这个命名空间仅用于导出python可见变量。

但是,大多数变量对python不可见。这些变量在编译时声明,并且是静态类型的。假设引用的任何未在模块中声明的变量都是错误,而是希望稍后将该变量添加到模块全局变量中。

规避这个问题的唯一方法是通过模块全局变量来引用这些变量。不是很优雅。

print(globals()["STORE_GLOBAL"])

最好的选择是导入opmap并通过它引用相关值。或者在模块中逐字写出opmap中的值。

答案 1 :(得分:0)

我不知道这是否记录在任何地方,但我发现如果在Cython模块的任何函数的global语句中声明了名称,那么除了标准Python的含义&#34;这个名称应该在 this function&#34;中作为全局变量读取和写入,它还有允许名称​​ read <的副作用/ em>作为模块中其他地方的全局变量,可以抑制问题中的错误。