避免使用顶级导入进行多次读取
最近我’一直在与需要导入大型JSON定义文件的各种应用程序一起使用,这些文件定义了复杂的应用程序设置。通常,代码库中的多个辅助模块都需要这些文件。所有软件工程原理都指向仅一次导入此类文件,而不管其使用了多少个辅助模块。
我的本能方法是在文件中读取一个主处理程序模块,然后将其内容作为类初始化参数传递:
main_handler.py
蟒蛇
1 2 3 4 5 6 7 8 9 10 11 12 |
#main_handler.py 进口 json 从 模块1 进口 Class1 从 模块2 进口 Class2 与 打开(“ 设定.json”) 如 f: 设定 = json.加载(f) init1 = Class1(设定=设定) init2 = Class2(设定=设定) |
问题是如果您有一个复杂的导入过程,并且要导入多个文件,它可能会开始看起来很凌乱。我最近发现,这种多重初始化参数方法不是’t实际上是必要的。
在Python中,您实际上可以在两个辅助模块(module1和module2)中导入相同的设置加载器模块,而python只会加载一次:
main_handler.py
蟒蛇
1 2 3 4 5 6 7 |
#main_handler.py 从 模块1 进口 Class1 从 模块2 进口 Class2 init1 = Class1() init2 = Class2() |
模块1.py
蟒蛇
1 2 3 4 5 6 7 |
#module1.py 进口 设定_loader 类 Class1: 定义 __在里面__(自): 自.设定 = 设定_loader.设定 |
模块2.py
1 2 3 4 5 6 7 |
#module2.py 进口 设定_loader 类 Class2: 定义 __在里面__(自): 自.设定 = 设定_loader.设定 |
设定_loader.py
蟒蛇
1 2 3 4 5 6 7 |
#settings_loader.py 进口 json 与 打开(“ 设定.json”) 如 f: 打印 “正在加载设置文件!” 设定 = json.加载(f) |
现在,当我们在终端中对此进行测试时:
终端输出
贝壳
1 2 3 4 5 |
MRMAC:进口测试 脆弱的$ MRMAC:进口测试 脆弱的$ MRMAC:进口测试 脆弱的$ 蟒蛇 main_handler.py 载入中 的 设定 文件! MRMAC:进口测试 脆弱的$ |
尽管打电话 进口 设定_loader 两次,Python实际上只调用了一次。这是非常有用的,但是如果您实际上想两次导入文件,也可能引起头痛。如果是这样,那么我会将设置导入器包含在 __在里面__() 每个ClassX实例化两次。