通过下面的方法,无法获得非空的 Dataset
from utils.dataset import CopilotOperationDataset
from utils.test import test_func
Dataset = None
sut_url = None
if __name__ == "__main__":
Dataset = CopilotOperationDataset('./dataset.json')
test_func()def test_func():
from run import Dataset
print(Dataset.api_iter)你的问题出在变量的作用域上。在你的代码中,你在 __main__ 作用域中声明和初始化了 Dataset 变量。然后在 test_func() 函数中,你试图访问到那个 Dataset 变量。然而,因为 test_func() 在 utils.test 模块中定义,它不能直接访问在其他模块或作用域中定义的 Dataset 变量。
在模块层级引入,或者说在一个函数中引入来自另一个模块的变量或函数,Python 都会跳到那个模块的最顶端开始执行。这就意味着你的 from run import Dataset 实际上并不会导入你在 __main__ 代码块中创建的 Dataset 实例。相反,它会获取在 run 模块顶层定义的 Dataset 变量,它的初始值是 None,这就是为什么 test_func() 获取的 Dataset 是 None 的原因。
Python 中,__main__ 全局作用域里面的变量,在其他模块想要引用的时候比较复杂,建议的方式一般是通过传参或者在某一作用域内全局声明。
如果坚持要跨模块共享变量,并非传参,也可以将变量保存在一个单独的模块中,然后在需要用到这个变量的所有其他模块中导入这个模块。可以创建一个新的模块,例如 config.py:
# config.py
Dataset = None然后,在 run.py 中,您可以修改这个变量:
# run.py
from config import config
from utils.dataset import CopilotOperationDataset
from utils.test import test_func
config.Dataset = CopilotOperationDataset('./dataset.json')
if __name__ == "__main__":
test_func()至于在 test_func() 中,你可以如此导入:
# utils/test.py
def test_func():
from config import config
print(config.Dataset.api_iter)这种方法能够在不同的模块之间共享 Dataset,但请注意当你查看你的代码的时候可能会对其来源感到困惑。所以记住,明确的是可读的,建议的方式仍然是传参数。