我正在为以前有Cython工具链的模块编写Python字节码优化器。虽然到现在为止,这可能已经不受欢迎了,但我在摆弄它的时候遇到了一些奇怪的事情。考虑一下这段简单的代码:
from opcode import opmap
globals().update(opmap)
print(STORE_GLOBAL)这应该打印97,因为STORE_GLOBAL是用其操作码( 97)在opmap中定义的。但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现在是一个变量。
有什么办法可以克服这个问题吗?
干杯
发布于 2015-02-20 22:59:11
原因是,尽管cython模块具有一个在python中公开的全局命名空间,但这个名称空间仅用于导出python可见变量。
但是,大多数变量对python是不可见的。这些变量是在编译时声明的,并且是静态输入的。假设没有在模块中声明的任何引用变量都是错误的,而是希望稍后将该变量添加到模块全局。
避免这种情况的唯一方法是通过模块全局引用这些变量。不太优雅。
print(globals()["STORE_GLOBAL"])最好的选择是导入opmap并通过它引用相关的值。或者在模块中逐字写出opmap中的值。
发布于 2017-12-23 16:17:11
我不知道这里是否有文档,但我发现如果在Cython模块中的任何函数中都在global语句中声明了一个名称,那么除了标准的Python含义“这个名称在这个函数中应该是一个全局变量”之外,它还有一个副作用,就是允许将名称读入模块中其他任何地方的全局变量,从而消除问题中的错误。
https://stackoverflow.com/questions/28639049
复制相似问题