我正在开发一个大型Python程序,它根据命令行选项使用大量模块,特别是numpy
。我们最近发现需要在一个小的嵌入式模块上运行它,这会阻止使用numpy。从我们的角度来看,这很容易(只是不要使用有问题的命令行选项。)
但是,在PEP 8之后,我们的import numpy
位于每个可能需要它的模块的开头,并且由于未安装numpy
,程序将崩溃。直接的解决方案是将import numpy
从文件顶部移动到需要它的函数。问题是,“这有多糟糕?”
(另一种解决方案是将import numpy
包裹在try .. except
中。这样更好吗?)
答案 0 :(得分:1)
这是一个最佳实践模式,用于检查模块是否已安装并根据它进行代码分支。
# GOOD
import pkg_resources
try:
pkg_resources.get_distribution('numpy')
except pkg_resources.DistributionNotFound:
HAS_NUMPY = False
else:
HAS_NUMPY = True
# You can also import numpy here unless you want to import it inside the function
在每个模块导入中执行此操作,该模块具有与numpy的软依赖关系。 More information in Plone CMS coding conventions
答案 1 :(得分:1)
我见过的另一个习惯用法是将模块导入为None(如果不可用):
try:
import numpy as np
except ImportError:
np = None
或者as in the other answer,您可以使用上面的pkg_resources.get_distribution
,而不是尝试/除(请参阅the blog post中链接到的plone docs)。
这样,在使用numpy之前,你可以在if块中隐藏numpy的使用:
if np:
# do something with numpy
else:
# do something in vanilla python
密钥是为了确保您的CI测试具有两种环境 - 有和没有numpy(如果您正在测试覆盖范围,则应将这两个块都计为覆盖)。