2013-05-05 99 views
2

假设我有一个主模块app.py,它定义了一个全局变量GLOBVAR = 123。此外,该模块导入位于另一个模块foobarPython:如何访问调用模块中的变量?

from foo import bar 

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

一种简单的方法是简单地将GLOBVAR作为参数传递给方法。但是Python中是否还有另一个解决方案,可以直接访问GLOBVAR

在模块foo我尝试以下之一:

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

然而,这两个选项导致以下运行时错误:

ImportError: cannot import name bar 

我明白这导致app之间的循环进口和foo。那么,在Python中是否有解决方案,还是必须将该值作为参数传递给函数?

+0

这就是为什么Globals是邪恶的 – Ant 2013-05-05 17:37:35

+1

@Ant:是的,我同意全球通常不是要走的路。但是,我也认为在某些情况下它们是可以的,尤其是原型。但我认为这将是另一个线程的讨论:) – Matthias 2013-05-05 17:40:30

回答

4

有很多方法来解决同样的问题,并传递参数通常是建议的。但是如果你确实有一些包宽的全局常量,你也可以这样做。您需要将它们放在整个其他模块中,并从appfoo模块中导入该模块。如果你构建一个全局包,你甚至可以把它们放在__init__.py ......但是也可以使用另一个命名模块,如settingsconfig

例如,如果你封装布局是:

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

然后:

配置。PY

GLOBVAR = 'something' 

app.py

from mypackage.config import GLOBVAR 

foo.py

from mypackage.config import GLOBVAR 

,如果你只是把__init__.py的变量globvar那么你会怎么做from mypackage import GLOBVAR如果你去那这可能是更漂亮那类的东西。

编辑我也建议使用绝对导入,即使你使用python 2,并且始终使用包名明确,而不是为了可读性相对进口,因为它使事情变得更容易,如果你需要在以后拆出移动的东西到一个新的不同的包

+0

谢谢,这是对我的问题非常有帮助的答案。即使在我使用该方法之前直接导入'GLOBVAR',正如Aryan所建议的,我接受你的答案,因为它看起来更加优雅。 – Matthias 2013-05-05 17:51:47

1

你应该在你想使用GLOBVAR之前写入import line,这样可以防止循环!

+0

谢谢,这解决了我的问题。 – Matthias 2013-05-05 17:48:17

+0

不客气! ;) – Aryan 2013-05-05 17:49:52

1

在foo.py,线

from app import GLOBVAR 

必须是bar类定义后。

1

您可以将GLOBVAR放入第三个模块,将其导入foo,并将其从foo导入app

glob.py:

GLOBVAR=None 

foo.py:

class bar: 
    global GLOBVAR 
    from glob.py import GLOBVAR 

app.py:

from foo import GLOBVAR 
import foo 
0

您可以从__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处于功能级别,其中之后进行评估。与导入时评估的模块级别(变量尚不存在的地方)相反。

相关问题