为什么将 import 语句放在函数内部并不常见?
Why is it uncommon for import statements to be placed inside functions?
我正在维护一些 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()
。
当然,理想情况下,依赖关系会得到正确管理,不过,如果函数仅在它们不得不失败时才失败,那么它会产生一个更健壮的包。
为什么导入几乎从不在函数范围内完成,有什么原因吗?这个原因只是减少行数吗?
Is there any reason why imports are almost never done in function scope?
原因是您通常希望尽早检测到错误。一个函数可能只会在一段时间后被调用,所以通过在函数内部导入,你可以让一个程序 看起来 可以工作,只是在 run-time 的某个时候失败。当经过长时间计算或在客户现场的生产中使程序崩溃时,此类故障尤其是坏消息,最好避免。
如果功能设计为可选,则以上内容不适用。在这种情况下,在函数内部导入是非常合适的,可能会捕获 ImportError
并将其重新引发为业务异常。
我正在维护一些 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()
。
当然,理想情况下,依赖关系会得到正确管理,不过,如果函数仅在它们不得不失败时才失败,那么它会产生一个更健壮的包。
为什么导入几乎从不在函数范围内完成,有什么原因吗?这个原因只是减少行数吗?
Is there any reason why imports are almost never done in function scope?
原因是您通常希望尽早检测到错误。一个函数可能只会在一段时间后被调用,所以通过在函数内部导入,你可以让一个程序 看起来 可以工作,只是在 run-time 的某个时候失败。当经过长时间计算或在客户现场的生产中使程序崩溃时,此类故障尤其是坏消息,最好避免。
如果功能设计为可选,则以上内容不适用。在这种情况下,在函数内部导入是非常合适的,可能会捕获 ImportError
并将其重新引发为业务异常。