如何从子包访问'global'变量?

问题描述 投票:1回答:1

我目前正在尝试发布一些更大的项目。这就是我决定使用子模块的原因。看一下项目结构:

/sandbox              
    __init.py__
    constants.py

    /sub1
        __init__.py
        foo.py

在我的constants.py文件中,我声明了一个全局变量:

MYGLOBAL = 42

我想在foo.py中使用它的值。该文件有2个用于测试的函数:

def foofunc():
    return 'I am foo.'

def constfunc():
    return 'I am {MYGLOBAL}.'

另外,我将此代码放入/sandbox/sub1/__init__.py

from .foo import *
from sandbox.constants import *

现在,当我使用我的解释器时,我尝试使用这两个函数:

>> import sandbox.sub1
>> sandbox.sub1.foofunc()
'I am foo.'
>> sandbox.sub1.MYGLOBAL
42
>> sandbox.sub1.constfunc()
NameError: name 'MYGLOBAL' is not defined

据我所知,全局变量与函数位于同一名称空间中,但不知何故函数看不到它。

我该如何访问它? Python版本是3.6。

谢谢!

python python-3.x packaging
1个回答
2
投票

“全局”变量在Python中并不是真正的全局变量,只能在定义它们的模块的命名空间中使用。

您应该在constants中导入foo.py,以便MYGLOBAL可以作为constants模块对象的属性使用:

from sandbox import constants
def constfunc():
    return f'I am {constants.MYGLOBAL}.'
© www.soinside.com 2019 - 2024. All rights reserved.