导入前进行检查的pythonic方法

导入前进行检查的pythonic方法,python,python-3.x,Python,Python 3.x,我必须为一个内部框架开发python代码,该框架可以在系统的标准python环境中运行,或者有时需要一个自定义环境来激活。例如,能够加载某些模块。 因为对于任何用户来说,ImportError可能不太明显,所以我想给用户一条正确的错误消息,解释这个问题 一些示例代码可能如下所示: # standard imports... import sys import numpy as np # import which requires special environment import mysp

我必须为一个内部框架开发python代码,该框架可以在系统的标准python环境中运行,或者有时需要一个自定义环境来激活。例如,能够加载某些模块。 因为对于任何用户来说,
ImportError
可能不太明显,所以我想给用户一条正确的错误消息,解释这个问题

一些示例代码可能如下所示:

# standard imports...
import sys

import numpy as np

# import which requires special environment
import myspecialmodule

# [...]
# standard imports...
import sys

import numpy as np

# import which requires special environment
try:
    import myspecialmodule
except ImportError:
    print('not in the env', file=sys.stderr)
    sys.exit(1)

# [...]
一种方法是检查
ImportError
s,如下所示:

# standard imports...
import sys

import numpy as np

# import which requires special environment
import myspecialmodule

# [...]
# standard imports...
import sys

import numpy as np

# import which requires special environment
try:
    import myspecialmodule
except ImportError:
    print('not in the env', file=sys.stderr)
    sys.exit(1)

# [...]
然而,这是相当乏味的,特别是如果有许多这样的脚本或有许多导入。问题是,如果您不想重复
,请尝试几次
/
,除了

现在,我编写了一个函数
guard()

import sys
import os


def guard():
    # assume the environment sets this special variable
    if 'MYSPECIALENV' in os.environ:
        # do more checks if the environment is correctly loaded
        # if it is, simply:
        return

    print("The environment is not loaded correctly. "
          "Run this script only in the special environment", file=sys.stderr)
    sys.exit(1)
我更改了脚本上的导入:

# standard imports...
import sys

import numpy as np

# import which requires special environment
guard()
import myspecialmodule

# [...]
try
/
方法相比,除了
之外,该方法的优点是,即使加载了环境,仍会引发
ImportError

但问题是,像这样的代码过滤器不喜欢导入之前的函数调用。 现在,可以将配置添加到isort以跳过此部分

此外,对于代码的读者来说,发生的事情可能不太明显。 当然,我可以添加一些注释来解释它

我想到的另一种方法是编写一个模块来完成保护工作,即:

# file: guard/__init__.py
import sys
import os

if 'MYSPECIALENV' not in os.environ:
    print("The environment is not loaded correctly. "
          "Run this script only in the special environment", file=sys.stderr)
    sys.exit(1)
但这可能更不明显,特别是当导入可能以不同的方式进行排序时(再次考虑isort)


在导入模块之前,是否有更好、更具python风格的方法来执行这些操作?特别是对于未来的开发人员来说,这一点是显而易见的。

简单地说,你想检查一个包是否存在于虚拟环境中?“代码过滤器[…]不喜欢导入前的函数调用”过滤器是你的仆人,而不是相反。如果你在找不到模块的情况下退出,为什么不干脆让恐怖泡沫起来?开发人员应该能够很容易地理解这一点。@BhavyadeepYadav是的。但是检查可能会被扩展,就像在guard函数中一样。没错。然而,在这种情况下,为linter添加大量注释也可能使事情变得更糟,最终无法阅读。。。但是,是的,在这种情况下,最好在导入之前指示linter允许此异常功能。