【发布时间】:2019-04-25 22:09:37
【问题描述】:
我们有一个文件,其中包含几个不同的类,它们都以不同的方式做同样的事情。这些类中的每一个都有几个来自外部包的导入。
然后我们的运行文件使用配置(解析为字典)来查找用户想要的方法,即使用哪个类。
现在,如果用户只使用一种方法,我们不想强迫用户获取所有软件包。所以我们想要一种处理条件导入的方法。
我看到有些人用简单的方式处理这个问题:
try:
import module
except ImportError:
try:
import other_module
except ImportError:
raise
但是,我们有相当多的此类导入,并且像这样以菊花链方式连接它们很难维护且笨拙。
我可以编写一些简单地遍历模块列表直到一个(或多个)成功导入的东西,但是这个逻辑应该去哪里呢?在包含类的文件中,还是在导入这些类的运行文件中?
最后,我们可以将导入添加到类的命名空间中:
class EngineOne:
import module
def methodology_one(self):
self.module.function()
class EngineTwo:
import other_module
def methodology_two(self):
self.other_module.function()
然而,这似乎很不标准,我找不到任何人们这样做的真实例子。 self.module.function() 也感觉很奇怪,即使将导入作为类变量是有意义的。
我简要浏览了一些已安装的常见数据科学软件包,但找不到使用此类东西的任何地方。
我发现了一些 stackoverflow 问题,其中简要提到了条件导入,例如 this one 和 this one,但没有一个可以很好地描述我们的案例的具体示例。
感谢您的帮助。
【问题讨论】:
-
是否有这么多模块,默认导入它们会占用相当多的整体执行时间?如果没有:导入它们而不使用它们似乎不是一个糟糕的解决方案。
-
我同意,但执行时间对我们来说不是问题。更重要的是,这些是具有许多依赖项的大型模块,可能会给用户带来环境问题。我们希望为不想要一切的用户简化安装过程。
-
我认为拥有一个包含所有应该加载的模块然后循环槽的列表/字典是最优雅的解决方案,它感觉比类解决方案更好.这个逻辑应该是在你的主执行文件中需要模块的地方。
-
我担心执行文件可能会变得混乱;在
__init__.py文件中编写这种逻辑会更好吗?尽管这可能会混淆模块的来源。我会尝试两者并希望发布答案。谢谢。
标签: python python-3.x oop import