Python:整个包只导入模块一次

3 投票
3 回答
6816 浏览
提问于 2025-04-17 17:41

我现在正在编写一个应用程序,它的结构大致是这样的:

main.py
+ Package1
+--- Class1.py
+--- Apps
+ Package2
+--- Class1.py
+--- Apps

所以我有两个问题:

首先,在这两个包里面,有一些模块是所有应用程序都需要的,比如:re。有没有办法一次性导入整个包所需的模块,而不是在每个需要它的文件里都导入一遍?

其次,正如你所看到的,Class1在两个包中都被使用。有没有好的方法可以在这两个包之间共享它,以避免代码重复?

3 个回答

0

问题1:
必须找到一种方法来导入你的包,所以你有两个选择:
(如果我说错了或者不够详细,请纠正我)

1. 看看James的解决方案,你需要定义一个类,把所有模块放在里面,最后再导入到你的子类中。

2. 基本上在你的主类中不导入任何东西,而是只在子类中导入一次。

举个例子:(在A_1子类里面) import re
def functionThatUseRe(input): pass

然后在你的主类中,只需要这样做: try: from YourPackage import A_1 #windows except: import A_1 #MAC OSX
A_1.functionThatUseRe("")

这样你就完全避免了多次导入模块的问题。

问题2:把你的class1.py放在和主类同一个文件夹里,或者移动到另一个文件夹,比如Package1(&2).Apps。

import Class1

从那里开始使用代码。

0

针对你的第二个问题,如果你有两个名为 Class1.py 的模块,它们实际上是一样的,那么你就不需要把它复制到两个包里。你应该把它放在一个只包含两个包共有代码的地方,然后再去引用它。完全没有必要去复制这个文件,还要在两个副本中保持每次的修改。

5

我强烈建议不要这样做:把导入的内容和使用这些功能的模块分开,会让你更难追踪模块之间的依赖关系。

不过,如果你真的想这么做,可以考虑创建一个新的模块,叫做 common_imports(比如这个名字),然后在里面进行你需要的导入。

接着在其他模块中,添加以下内容:

from common_imports import *

这样做应该能让你获取到那个模块中的所有公共名称(包括所有的导入内容)。

撰写回答