【问题标题】:Handling many optional imports处理许多可选的导入
【发布时间】: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 onethis one,但没有一个可以很好地描述我们的案例的具体示例。

感谢您的帮助。

【问题讨论】:

  • 是否有这么多模块,默认导入它们会占用相当多的整体执行时间?如果没有:导入它们而不使用它们似乎不是一个糟糕的解决方案。
  • 我同意,但执行时间对我们来说不是问题。更重要的是,这些是具有许多依赖项的大型模块,可能会给用户带来环境问题。我们希望为不想要一切的用户简化安装过程。
  • 我认为拥有一个包含所有应该加载的模块然后循环槽的列表/字典是最优雅的解决方案,它感觉比类解决方案更好.这个逻辑应该是在你的主执行文件中需要模块的地方。
  • 我担心执行文件可能会变得混乱;在__init__.py 文件中编写这种逻辑会更好吗?尽管这可能会混淆模块的来源。我会尝试两者并希望发布答案。谢谢。

标签: python python-3.x oop import


【解决方案1】:

最后,我们决定将每种方法的类分开到单独的文件中,然后将它们放入带有__init__.py 的目录中。这个__init__.py 然后包含一些循环导入的逻辑,捕获任何导入错误。

结构是:

main_dir
   - __init__.py
   - engines.py
      - class EngineOne
         ...
      - class EngineTwo
         ...
      - class EngineThree
         ...
   - run.py
   - ...

而现在,结构是:

main_dir
   - __init__.py
   - engines_dir
      - __init__.py   # Contains logic for import checking
      - method_one.py
         - class EngineOne
            ...
      - method_two.py
         - class EngineTwo
            ...
      - method_three.py
         - class EngineThree
            ...
   - run.py   # Just imports the engines_dir module
   - ...

我们这样做有几个原因。

  • 我们不希望主运行文件混乱,因为我们添加了更多条件导入。如果我们的几个执行阶段每个都有几个选项,那么运行文件很快就会被关于配置的循环导入弄得一团糟。

  • 我们也需要我们的包是可导入的。这意味着将导入检查放入运行文件会在直接导入其他位置时导致问题。

虽然这是一个的答案,但我不相信这是的答案。可能有更好的方法来做到这一点,但这对我们很有效。如果得到更好的答复,我不会将问题标记为已解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2017-12-07
    • 2018-10-20
    相关资源
    最近更新 更多