代码之家  ›  专栏  ›  技术社区  ›  DocDriven

如何从子包访问“global”变量?

  •  0
  • DocDriven  · 技术社区  · 6 年前

    我目前正试图推出一些更大的项目。这就是我决定使用子模块的原因。看看项目结构:

    /sandbox              
        __init.py__
        constants.py
    
        /sub1
            __init__.py
            foo.py
    

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

    MYGLOBAL = 42
    

    我想利用它的价值 foo.py . 此文件有两个测试功能:

    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。

    谢谢!

    0 回复  |  直到 6 年前
        1
  •  2
  •   blhsing    6 年前

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

    你应该导入 constants 在里面 foo.py 以便 MYGLOBAL 可以作为 常数 模块对象:

    from sandbox import constants
    def constfunc():
        return f'I am {constants.MYGLOBAL}.'