Python模块能否作为变量?如何通过配置统一控制多脚本模块导入?
问题描述
我有Settings.py、调用它的测试文件(比如Test1.py),还有被这两个文件调用的多个功能文件(Fun1.py、Fun2.py)。我希望通过修改Settings.py里的变量,就能统一控制所有脚本导入的功能文件版本。
目前已经用if判断实现了,但每个测试文件里都要重复写相同的判断逻辑:
# Settings.py Version = 1 if Version == 1: import Fun1 as Functions elif Version == 2: import Fun2 as Functions else: print("Invalid Version") # Test1.py import Settings if Settings.Version == 1: import Fun1 as Functions elif Settings.Version == 2: import Fun2 as Functions else: print("Invalid Version")
我不想在每个测试文件里都重复这段逻辑,试过下面的写法但Python不允许,求替代方案:
# Settings.py Fun_File = Fun1 import Fun_File # Test1.py import Settings myFile= Settings.Fun_File import myFile as Functions
解决方案
方法一:在Settings.py中完成导入,测试文件直接引用
修改Settings.py,把功能模块的导入逻辑封装好,测试文件只需要从Settings里直接拿Functions即可:
# Settings.py Version = 1 if Version == 1: import Fun1 as Functions elif Version == 2: import Fun2 as Functions else: raise ValueError("Invalid Version")
测试文件里直接这样用:
# Test1.py from Settings import Functions # 直接调用Functions里的方法,比如 Functions.some_function()
只要修改Settings.py里的Version变量,所有测试文件都会自动加载对应的功能模块,不用重复写判断逻辑。
方法二:使用importlib动态导入
如果版本较多或者需要更灵活的导入方式,可以用Python的importlib模块实现动态导入:
# Settings.py import importlib Version = 1 module_name = f"Fun{Version}" try: Functions = importlib.import_module(module_name) except ModuleNotFoundError: raise ValueError("Invalid Version")
测试文件一样直接引用:
# Test1.py from Settings import Functions # 调用功能方法 Functions.another_function()
这种方式更简洁,新增版本时只要添加对应的FunX.py文件,修改Version即可,不用修改if判断分支。
方法三:把导入逻辑封装成函数
如果需要在运行时切换版本,可以在Settings.py里写一个导入函数:
# Settings.py import importlib def get_functions(version): module_name = f"Fun{version}" try: return importlib.import_module(module_name) except ModuleNotFoundError: raise ValueError(f"Invalid Version: {version}") # 默认版本 Default_Version = 1 Functions = get_functions(Default_Version)
测试文件可以直接用默认的Functions,也可以手动指定版本:
# Test1.py from Settings import Functions, get_functions # 使用默认版本 Functions.test_func() # 手动切换版本 v2_funcs = get_functions(2) v2_funcs.test_func()
内容的提问来源于stack exchange,提问作者user12728757
相关产品推荐
相关产品推荐

