如何为导入的全局变量赋值?

2024-09-29 21:47:37 发布

您现在位置:Python中文网/ 问答频道 /正文

经过这么多年,我仍然不喜欢Python中的globals。我的问题出现在一个uWSGI应用程序中,在init()中,我在声明global BROWSER后设置BROWSER = webdriver.Firefox(),而实际上并没有设置变量。但我也在Python命令行中看到了它,希望如果我能理解为什么这个简单的示例不起作用,它也能解决我的uWSGI问题

globaltest.py

#!/usr/bin/python3
'''
Test of keyword `global`
'''
GLOBALTEST = None

def init():
    global GLOBALTEST
    GLOBALTEST = 'Something'

if __name__ == '__main__':
    print('before init: GLOBALTEST', GLOBALTEST)
    init()
    print(' after init: GLOBALTEST', GLOBALTEST)

执行:

jcomeau@bendergift:/tmp$ ./globaltest.py 
before init: GLOBALTEST None
 after init: GLOBALTEST Something
jcomeau@bendergift:/tmp$ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from globaltest import *
>>> GLOBALTEST
>>> init()
>>> GLOBALTEST
>>> 

Tags: pybrowsernoneinitglobaluwsgisomethingpython3
2条回答

根据chepner的回答,我能够通过以下困难部分解决我的uwsgi问题:

if not APP in sys.modules:  # will be the case with uwsgi
    exec('import %s' % APP)
sys.modules[APP].BROWSER = webdriver.Firefox()

但是,我在后台运行的线程仍然不能正常工作,就像我尝试将webdriver初始化移动到子例程之前一样。所以我回到了在if __name__ == '__main__'else块中初始化它

需要记住的主要一点是,Python只有一个作用域是真正的全局的:内置作用域。“全局”范围实际上是一个模块全局范围,程序中的每个模块都有一个

在交互式会话中有两个名为GLOBALTEST全局变量。一个是模块globaltest的全局范围的一部分;另一个是交互式会话的全局范围的一部分,模块__main__

init设置globaltest.GLOBALTEST的值,因为Python使用词法作用域。您正在检查调用init前后__main__.GLOBALTEST的值

如果您检查globaltest.GLOBALTEST的值,您将看到它的值发生变化:

>>> from globaltest import *
>>> import globaltest
>>> globaltest.GLOBALTEST
>>> init()
>>> globaltest.GLOBALTEST
'Something'
>>> GLOBALTEST
>>>

相关问题 更多 >

    热门问题