首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用globals().update(.)?

使用globals().update(.)?
EN

Stack Overflow用户
提问于 2015-02-20 22:05:48
回答 2查看 375关注 0票数 0

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

代码语言:javascript
复制
from opcode import opmap

globals().update(opmap)

print(STORE_GLOBAL)

这应该打印97,因为STORE_GLOBAL是用其操作码( 97)在opmap中定义的。但Cython会告诉我,STORE_GLOBAL没有定义,不过:

代码语言:javascript
复制
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现在是一个变量。

有什么办法可以克服这个问题吗?

干杯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-20 22:59:11

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

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

避免这种情况的唯一方法是通过模块全局引用这些变量。不太优雅。

代码语言:javascript
复制
print(globals()["STORE_GLOBAL"])

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

票数 2
EN

Stack Overflow用户

发布于 2017-12-23 16:17:11

我不知道这里是否有文档,但我发现如果在Cython模块中的任何函数中都在global语句中声明了一个名称,那么除了标准的Python含义“这个名称在这个函数中应该是一个全局变量”之外,它还有一个副作用,就是允许将名称读入模块中其他任何地方的全局变量,从而消除问题中的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28639049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档