【问题标题】:What's the Pythonic way to write conditional statements based on installed modules?根据已安装的模块编写条件语句的 Pythonic 方式是什么?
【发布时间】:2019-12-13 03:16:17
【问题描述】:

来自 C++ 世界,我习惯于基于在编译时使用 CMake 等工具确定的标志来编写条件编译。我想知道模仿此功能的最 Pythonic 方式是什么。例如,这是我当前根据是否找到模块设置的:

import imp

try:
    imp.find_module('petsc4py')
    HAVE_PETSC=True
except ImportError:
    HAVE_PETSC=False

然后我可以在其余的 Python 代码中使用HAVE_PETSC。这可行,但我想知道这是否是在 Python 中执行此操作的正确方法。

【问题讨论】:

  • 为什么使用imp 而不仅仅是import petsc4py 并在没有找到异常的情况下捕获异常?
  • 根据我的经验,“Pythonism”通常更喜欢“请求宽恕而不是请求许可”而不是“先看再跳”,所以正如@khelwood 所说,你会使用 try-except。虽然如果你实际上不需要使用petsc4py,也许你的代码是 Pythonic,idk。

标签: python conditional-statements


【解决方案1】:

你这样做的方式或多或少都很好。事实上,python 标准库使用类似的范例“尝试导入某些东西,如果由于某种原因它无效,然后以某种方式设置一个变量”inmultipleplaces。检查是否在程序中稍后设置了布尔值,这比每次都执行单独的 try/except 块要快。

不过,在你的情况下,这样做可能会更好:

try:
    import petsc4py
    HAVE_PETSC = True
except ImportError:
    HAVE_PETSC = False

你所拥有的东西在范式层面上有效,但在这种情况下没有真正的理由通过importlib(而且你可能不应该使用imp,因为它在最近版本的python中已被弃用)。

【讨论】:

    【解决方案2】:

    是的,没关系。您甚至可以直接发出导入,并且 使用模块名本身作为标志 - 如:

    try:
        import petsc4py
    except ImportError
        petsc4py = None
    

    在任何使用之前,只需测试petsc4py 本身的真实性。

    实际上,检查它是否存在,然后才尝试导入它,由于冗余,感觉很不合时宜,因为这两个操作都会触发 ImportError。但是有一个 HAVE_PETSC 变量用于检查是可以的 - 它可以在上面的 try/except 之后创建 HAVE_PETSC = bool(petsc4py)

    【讨论】:

    • 感谢您的回答。最后一件事:我采用了 C++ 的方式来命名这种类型的变量 (HAVE_PETSC),但也许在 Python 中有不同的约定?
    • 不,我认为所有带下划线的大写字母都可以用于在执行过程中不会改变的变量。
    • “实际上,检查它是否存在,然后才尝试导入它,由于冗余而感觉不合Python”在使用它之前检查模块是否存在不一样吗? IMO 根据是否安装了某些依赖项来划分和加载您自己的代码会更少冗余,或者更好的是,失败并出现错误“如果没有 X 模块,此功能无法访问,请使用 pip install X==someversionifrequired 安装它”,其中功能将是它自己的模块,在加载时会引发此类异常。
    • 如果没有 try/except 步骤,您的代码根本无法运行 - 甚至无法打印功能不可用或打印有关如何安装依赖项的提示。如果它是一个完整的、非可选的依赖项,那么是的,代码应该假设它已安装,如果不是,则让错误传播(并让安装程序处理依赖项)
    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2010-11-22
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多