如何在每次类调用时初始化全局变量?

时间:2012-10-11 11:06:32

标签: python

我有一个模块A,如下所示:

import unittest2

def check_function():
    # performs actions and returns True or False
    return smth

CHECK = check_function()

class A(unittest2.TestCase):

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # test check

    @unittest2.skipIf(CHECK, "skip message 2")
    def test_2(self):
        # test check

模块A由另一个模块导入,称为B. 何时全局变量CHECK初始化?在进口?在课堂实例化?

每次调用A类时,我都需要设置CHECK变量。我怎样才能做到这一点?

编辑: 我尝试了以下(可能是我正在寻找的),但是在setUpClass中没有设置CHECK(无论check_function()返回什么,它都保持False。)

import unittest2

def check_function():
    # performs actions and returns True or False
    return smth

CHECK = False

class A(unittest2.TestCase):

    global CHECK

    @classmethod
    def setUpClass(cls):
        CHECK = check_function()

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # test check

    @unittest2.skipIf(CHECK, "skip message 2")
    def test_2(self):
        # test check

每次调用测试时,如何设置CHECK一次的想法?

编辑: check_function()肯定被调用一次,但我不明白为什么unittest2.skipIf没有“看到”setUpClass中设置的值,并坚持声明时设置的False值?

解决方案:

代码的最终骨架看起来像这样:

import unittest2

def check_function():
    # performs checks and returns True or False
    return smth

class A(unittest2.TestCase):

    CHECK = check_function()

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # do tests
        self.assertTrue(True)

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_2(self):
        # do tests
        self.assertTrue(True)

3 个答案:

答案 0 :(得分:2)

第一次模块导入时,CHECK变量已初始化。

参见示例。我有模块mymodule.py,其中包含:

print "i am mymodule"

还有一些anothermodule.py

print "first"

import mymodule

print "second"

import mymodule

print "third"

当我运行another module.py时,我得到:

first
i am mymodule
second
third

python中的邀请变量与printmymodule.py的命令相同 将在翻译时逐行执行,这将是您模块中的第一次。

更明确的例子。

def get_a(): print 'init a' return 42 def get_b(): print 'init b' return 20 a = get_a() b = get_b()

anothermodule.py

from mymodule import a print "a =", a print "b =", b

init a
init b
a = 42
Traceback (most recent call last):
  File "anothermodule.py", line 3, in <module>
    print b
NameError: name 'b' is not defined

结果:

{{1}}

答案 1 :(得分:1)

你的第二种方法看起来像一个起点。但是你遇到了计时问题。

一方面,您希望在应用装饰器时出现该值(非常早),另一方面,您在调用setUpClass()时进行设置。那可能已经很晚了。

在我看来唯一的选择

class A(unittest2.TestCase):
    CHECK = check_function()

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # test check

    @unittest2.skipIf(CHECK, "skip message 2")
    def test_2(self):
        # test check

其中CHECK的初始化时间早于使用。

答案 2 :(得分:0)

这个怎么样:

import unittest2

def check_function():
  # performs actions and returns True or False
  return smth

CHECK = None

class A(unittest2.TestCase):
    def __init__(self,*args,**kwargs):
        CHECK=check_funtion
        super(A,self).__init__(*args,**kwargs)

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # test check

    @unittest2.skipIf(CHECK, "skip message 2")
    def test_2(self):
        # test check