PEP 8和延期进口

时间:2015-11-18 17:08:59

标签: python pep8

我正在开发一个大型Python程序,它根据命令行选项使用大量模块,特别是numpy。我们最近发现需要在一个小的嵌入式模块上运行它,这会阻止使用numpy。从我们的角度来看,这很容易(只是不要使用有问题的命令行选项。)

但是,在PEP 8之后,我们的import numpy位于每个可能需要它的模块的开头,并且由于未安装numpy,程序将崩溃。直接的解决方案是将import numpy从文件顶部移动到需要它的函数。问题是,“这有多糟糕?”

(另一种解决方案是将import numpy包裹在try .. except中。这样更好吗?)

2 个答案:

答案 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(如果您正在测试覆盖范围,则应将这两个块都计为覆盖)。