导入前进行检查的pythonic方法
我必须为一个内部框架开发python代码,该框架可以在系统的标准python环境中运行,或者有时需要一个自定义环境来激活。例如,能够加载某些模块。 因为对于任何用户来说,导入前进行检查的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
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允许此异常功能。