2

假设我有一个app.py定义全局变量的主模块GLOBVAR = 123。此外,此模块导入bar位于另一个模块中的类foo

from foo import bar

在主模块中app,我现在从类中调用一个方法bar。在该方法中,我想GLOBVAR从主模块访问值app

一种直接的方法是简单地GLOBVAR作为参数传递给方法。但是Python中是否还有另一种允许我GLOBVAR直接访问的解决方案?

在模块foo中,我尝试了以下方法之一:

from app import GLOBVAR  # option 1
import app.GLOBVAR       # option 2

但是,这两个选项都会在运行时导致以下错误:

ImportError: cannot import name bar

我知道这会导致 和 之间的循环app导入foo。那么,在 Python 中有解决方案,还是我必须将值作为参数传递给函数?

4

5 回答 5

4

解决同一个问题的方法有很多,一般建议传参数。但是如果你确实有一些包范围的全局常量,你也可以这样做。您将希望将它们放在一个完整的其他模块中,并从两个模块中导入该app模块foo。如果您构建一个包全局变量,您甚至可以将它们放在... 但也可以使用__init__.py另一个命名模块,如settingsor 。config

例如,如果您的包装布局是:

mypackage/
    __init__.py
    app.py
    foo.py
    config.py

然后:

配置文件

GLOBVAR = 'something'

应用程序.py

from mypackage.config import GLOBVAR

foo.py

from mypackage.config import GLOBVAR

如果你只是把 GLOBVAR 放进去,那么如果你去做那种事情,__init__.py你会做这可能会更漂亮。from mypackage import GLOBVAR

编辑即使您使用的是python 2,我也建议使用绝对导入,并且始终明确使用包名称而不是相对导入以提高可读性,因为如果您需要将某些内容移动到新的不同位置,它可以让您以后更容易拆分包裹

于 2013-05-05T17:46:57.643 回答
2

__main__您可以像这样从模块中导入变量:

""" main module """
import foo
name = "Joe"
foo.say_hi()

foo.py

""" foo module, to be imported from __main__ """
import __main__
def say_hi():
    print "Hi, %s!" % __main__.name

它看起来像这样:

$ python main.py
Hi, Joe!

当然,您不能在定义变量之前访问它。因此,您可能需要将访问权限置于__main__.name功能级别,在导入后对其进行评估。与在导入时评估的模块级别(其中变量尚不存在)相反。

于 2013-05-05T18:04:45.063 回答
1

您应该只在要使用 GLOBVAR 的位置之前编写导入行,这将防止循环!

于 2013-05-05T17:40:06.520 回答
1

在 foo.py 中,行

from app import GLOBVAR

必须在bar类定义之后。

于 2013-05-05T17:45:16.043 回答
1

您可以将 GLOBVAR 放在第三个模块中,将fooapp导入foo.

glob.py:

GLOBVAR=None

foo.py:

class bar:
    global GLOBVAR
    from glob.py import GLOBVAR

应用程序.py:

 from foo import GLOBVAR
 import foo
于 2013-05-05T17:45:31.003 回答