通过下面的方法,无法获得非空的 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,但请注意当你查看你的代码的时候可能会对其来源感到困惑。所以记住,明确的是可读的,建议的方式仍然是传参数。