Python跨模块全局变量

时间:2013-05-13 14:35:37

标签: python nose python-import

我是Python新手,我尝试将鼻子作为一个单元测试框架。 我遇到了一个我没想到的行为,但也许这是正常的,因此我的问题。

我有两个(非常基本的)文件:

__ INIT __ PY:

#!/usr/bin/env python
glob = 0

def setup():
    global glob
    glob = 42
    print "Package setup"

test_mymod.py:

#!/usr/bin/env python
from unittest import TestCase
from . import glob

print "test_mymod.py"

class testMyMod(TestCase):
    def setUp(self):
        print glob

    def test_random(self):
        pass

    def tearDown(self):
        pass

运行nosetest -s会给我以下输出:

test_mymod.py
Package setup
0

由于在测试的setUp()函数之前调用了包的setup()函数,我希望看到print glob输出42

我做错了什么,或者没有办法做我想做的事情? 在我看来,导入变量复制其值而不是引用它,但也许还有办法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

当您在测试文件的顶部执行from . import glob时,您会在命名空间中获得glob的值的引用。这在您致电setup()之前发生。当您致电setup()时,glob名称空间中的__init__.py值已更新,但test_mymod.py未更新glob。不是直接导入package.glob,而是像glob一样引用它。或者,在包导入时将{{1}}设置为正确的值;由于这个原因,人们可以导入的全局变量被认为是不好的做法。