Python 为什么将import语句放在函数中并不常见?

Python 为什么将import语句放在函数中并不常见?,python,python-import,conventions,Python,Python Import,Conventions,我正在维护一些Python软件包,并且在依赖关系未完全满足的系统上,由于全局范围导入,可能无法正常工作的函数失败: import numpy as np def lala(in): out = max(in) return out def fufu(in): out = np.mean(in) return out 例如,如果我没有numpy,即使lala没有使用numpy,我也不能使用lala()。 当然,理想情况下,依赖关系将得到正确的管理,但是,如果函

我正在维护一些Python软件包,并且在依赖关系未完全满足的系统上,由于全局范围导入,可能无法正常工作的函数失败:

import numpy as np

def lala(in):
    out = max(in)
    return out

def fufu(in):
    out = np.mean(in)
    return out
例如,如果我没有numpy,即使lala没有使用numpy,我也不能使用
lala()。
当然,理想情况下,依赖关系将得到正确的管理,但是,如果函数只有在必须失败时才失败,那么它将有助于生成更健壮的包

为什么导入几乎从不在函数范围内完成?这仅仅是减少行数的原因吗

为什么导入几乎从不在函数范围内完成

原因是您通常希望更快地检测到错误,而不是更晚。函数只能在一段时间后调用,因此通过函数内部的导入,可以使程序看起来正常工作,但在运行时的某个点失败。当这些失败在长时间的计算后使程序崩溃,或者在客户站点的生产中崩溃时,这些失败尤其是坏消息,最好避免


如果功能设计为可选,则上述规定不适用。在这种情况下,在函数内部导入是非常合适的,可能需要捕获
ImportError
并将其作为业务异常重新调用。

这通常是针对可选依赖项执行的。但在大多数情况下,这些努力都是不值得的,而且通常更难阅读。如果您的库是使用numpy依赖项设计的,而您没有numpy,那么最好尽早了解这个问题。按功能比例对功能进行依赖性管理是很少见的。如果我的浴室例程有卫生纸依赖性,我想在开始之前知道该依赖性是否缺失,而不是在尝试执行使用卫生纸的步骤时。