我试图了解一些关于设计的事情。
我看到许多使用延迟导入功能的代码。通过延迟导入,我的意思是由支持“延迟导入”样式的某些配方、包和模块提供的设施。这些实现通常旨在仅在使用模块时导入模块,并为不同的事物提供一些额外的钩子。我知道错误情况在这里被延迟了,但我试图理解为什么延迟导入不是 Python 中的默认策略。
它的(其他)缺点可能会阻止它成为一般有用的案例。或者是否有语言将其用作默认导入机制策略。
我试图了解一些关于设计的事情。
我看到许多使用延迟导入功能的代码。通过延迟导入,我的意思是由支持“延迟导入”样式的某些配方、包和模块提供的设施。这些实现通常旨在仅在使用模块时导入模块,并为不同的事物提供一些额外的钩子。我知道错误情况在这里被延迟了,但我试图理解为什么延迟导入不是 Python 中的默认策略。
它的(其他)缺点可能会阻止它成为一般有用的案例。或者是否有语言将其用作默认导入机制策略。
这是python中延迟导入的示例:
def xmlfrobnicator(xmlstr):
from lxml import etree
# do whatever
它不常用,因为它为大多数程序提供的优势很少 - 一旦加载,模块就会被加载(除非您采取步骤卸载它),并且很少有依赖项很少使用以至于只在加载时加载它使用是值得的。
我想你可能一直在看 javascript,其中程序可能只运行很短的时间,并且不会使用它们的所有功能,即使它们这样做了,模块的后台加载也会提高用户感知的速度。
Python 与 PHP 不同,很少以每个请求/动作/... 导致整个应用程序重新启动的方式使用。
因此,在启动时导入所有内容的优点是不必在应用程序执行延迟令人讨厌的事情时执行导入。
本地/惰性导入的唯一优点是循环导入不会有问题。
有时模块在第一次加载时会做重要的事情,因此它可能会破坏程序以延迟模块的导入。例如,如果一个模块定义了应在程序首次启动时解析的命令行标志,则必须在解析参数之前导入该模块。由于 Python 最初设计为急切地进行导入,因此现在不可能在不破坏某些现有程序的情况下更改默认行为。此外,正如其他一些答案中所提到的,对于长时间运行的服务,通常希望在服务请求之前预先加载所有内容,这样前几个请求就不会因为等待模块被导入而减慢。