【问题标题】:Python : import module once for a whole packagePython:为整个包导入一次模块
【发布时间】:2023-04-11 06:33:02
【问题描述】:

我目前正在编写一个基本上采用这种结构的应用程序:

main.py
+ 套餐1
+--- Class1.py
+--- 应用程序
+ 包2
+--- Class1.py
+--- 应用程序

所以我有两个问题: 首先,在这两个包中,都有所有应用程序需要的模块,例如:re。有没有一种方法可以一次为整个包导入一个模块,而不是在每个需要它的文件中导入它?

而且,如您所见,Class1 用于两个包中。有没有什么好的方法可以在两个包之间共享以避免代码重复?

【问题讨论】:

  • 第一个问题的简答:否。
  • 必须在模块中定义变量,因此您必须导入所有需要的模块。另外,请记住,其他人可能会阅读您的代码,并且会看到这个未定义的 Apps 变量,并且不会理解它的来源;所以这是一个的主意。

标签: python import module package


【解决方案1】:

我强烈建议不要这样做:通过将导入与使用该功能的模块分开,您会更难以跟踪模块之间的依赖关系。

如果您真的想这样做,一种选择是创建一个名为 common_imports 的新模块(例如)并让它执行您所追求的导入。

然后在您的其他模块中,添加以下内容:

from common_imports import *

这应该为您提供该模块的所有公共名称(包括所有导入)。

【讨论】:

    【解决方案2】:

    回答你的第二个问题,如果你的两个名为Class1.py 的模块实际上是相同的,那么你不应该将它复制到两个包中。将它放在一个包中,该包只包含两者通用的代码,然后导入它。绝对不需要复制文件并尝试维护两个副本中的每个更改。

    【讨论】:

      【解决方案3】:

      第一季度:
      必须找到一种方法来导入您的包,因此您有两种选择:
      (如果我错了或不彻底,请纠正我)

      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("")

      而且您完全避免了多次导入模块

      Q2:把你的class1.py和你的主类放在同一个目录下,或者把它移到另一个文件夹,在Package1(&2).Apps中

      import Class1
      

      从那里开始使用代码

      【讨论】:

        猜你喜欢
        • 2019-03-26
        • 2017-06-12
        • 2014-04-30
        • 2011-06-09
        • 2018-04-23
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多