Python:无法从 init 文件导入在 setUp 方法中初始化的全局变量

标签 python scope global-variables python-unittest

我有一个包含测试模块的包,在 init 文件中我有一个带有一些操作的 setUp 方法。在包模块中的任何单元测试运行之前,这些操作都会正确执行。在 setUp 方法内,我想初始化一个全局变量,然后从包的其他模块访问它。但这不起作用。

# TestPackage/__init__.py
def setUp():
    global spec_project
    core_manager = get_core_manager()
    spec_project = core_manager.get_spec()

#TestPackage/test_module.py
from TestPackage import spec_project
import unittest

class TestRules(unittest.TestCase):
    def setUp(self):
        spec_project.get_new_device()

像这样我得到一个

ImportError: cannot import name spec_project

如果我在 init 文件中的 setUp 方法之外初始化 spec_project 变量,我可以访问它,但在 setUp 方法中的操作之后其内容不会更改。

# TestPackage/__init__.py
spec_project = None
def setUp():
    global spec_project
    core_manager = get_core_manager()
    spec_project = core_manager.get_spec()

#TestPackage/test_module.py
from TestPackage import spec_project
import unittest

class TestRules(unittest.TestCase):
    def setUp(self):
        spec_project.get_new_device()

像这样我得到一个

AttributeError: 'NoneType' object has no attribute 'get_new_device'

如何在 init 文件的 setUp 方法中初始化 spec_project 变量,并且仍然可以从包中的其他模块访问它?

最佳答案

看起来 setUp() 没有被调用,但如果您确定它被调用,那么这可能是您导入 TestPackage 的方式。尝试像这样导入:

#TestPackage/test_module.py
import TestPackage
import unittest

class TestRules(unittest.TestCase):
    def setUp(self):
        TestPackage.spec_project.get_new_device()

在使用全局之前必须调用 setUp() 方法。同样的事情应该适用于您尝试的第二种方法。但同样,这是假设 setUp 已运行。如果您认为有必要,您可以为 TestPackage 起别名,或者如果它是在方法外部定义的,您应该能够导入它。

由于您显式导入它,它可能会尝试创建它的副本,这是不可能的,因为它位于 setUp() 主体内部。

关于Python:无法从 init 文件导入在 setUp 方法中初始化的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942386/

相关文章:

c - 如何避免系统设置的 EEPROM 结构中的全局变量?

c++ - 从回调中访问数据

python - 使用python根据索引和非索引列对表值进行排序

python - 如何在python中创建多个变量的所有可能组合

php - 关于 PHP 中的作用域和 OOP

javascript - 在 Javascript 中注册变量和函数声明

function - 如何在调用者的上下文中调用脚本 block ?

python - 有没有什么东西可以放在你的代码中来启动一个交互式解释器(在 python 中)

python - 作用于旋转数据框的 Pandas 数据透视表

c++ - C++-有什么方法可以为性能和封装构造常量数据?