为什么在Python中惰性导入不是默认值?

为什么在Python中惰性导入不是默认值?,python,Python,我试图了解一些与设计有关的事情 我看到许多代码使用了惰性导入特性。所谓惰性导入,我指的是由支持“LazyImport”风格的某些配方、包和模块提供的工具。这些实现通常旨在仅在使用模块时导入模块,并为不同的事情提供一些额外的挂钩。我知道这里的错误条件被延迟了,但我试图理解为什么惰性导入不是Python中的默认策略 它的(其他)缺点可能是什么,阻止它成为一个通用的有用案例。或者有一些语言将此作为默认的导入机制策略。以下是python中的惰性导入示例: def xmlfrobnicator(xmlst

我试图了解一些与设计有关的事情

我看到许多代码使用了惰性导入特性。所谓惰性导入,我指的是由支持“LazyImport”风格的某些配方、包和模块提供的工具。这些实现通常旨在仅在使用模块时导入模块,并为不同的事情提供一些额外的挂钩。我知道这里的错误条件被延迟了,但我试图理解为什么惰性导入不是Python中的默认策略


它的(其他)缺点可能是什么,阻止它成为一个通用的有用案例。或者有一些语言将此作为默认的导入机制策略。

以下是python中的惰性导入示例:

def xmlfrobnicator(xmlstr):
    from lxml import etree

    # do whatever
它不常用,因为它对大多数程序没有什么好处——一旦加载,模块就被加载(除非您采取步骤卸载它),而且很少有依赖关系很少使用,只有在使用时才值得加载


我想你可能一直在关注javascript,在javascript中,程序可能只运行很短的一段时间,而不会使用所有的功能,即使它们使用了,后台加载模块也会提高用户感知的速度。

Python与PHP不同,它很少以每个请求/操作都会使用的方式使用。。。使整个应用程序重新启动。
因此,在启动时导入所有内容的好处是,当应用程序正在执行一些令人讨厌的延迟时,不必执行导入操作。

本地/延迟导入的唯一优点是,循环导入不会出现问题。

有时模块在首次加载时会做一些重要的事情,因此可能会中断程序以延迟模块的导入。例如,如果模块定义了在程序首次启动时应解析的命令行标志,则必须在解析参数之前导入该模块。由于Python最初设计用于急切地进行导入,因此现在不可能在不破坏某些现有程序的情况下更改默认行为。另外,正如其他一些回答中提到的,对于长时间运行的服务,通常希望在服务请求之前预先加载所有内容,以便在等待模块导入时不会减慢前几个请求的速度。

使用LazyImport的人说他们“拥有一个很少使用的依赖项,只有在使用时加载它才有价值“-我查看了提供LazyImport的实现,就像PEAK的导入一样-看起来不错,一点也不复杂。@SenthilKumaran如果你不想听答案,不要问这个问题。正如您在问题中所指出的,大多数python用户不使用惰性导入,这就是我给出的原因。事实上,我必须处理几个使用LazyImport的软件包,我必须先考虑一下。现在我明白了,我问为什么不是违约。(我试图理解技术上的缺陷,如果有的话)和我的另一个想法是——我正在使用的应用程序消除了LazyImport模块和基于组件的体系结构。所以这个问题很严肃,我想知道好的答案。我点击了“你想自动将这个讨论转移到聊天室吗?”然后我把我的想法贴在那里,它把它作为评论添加了进去。FWIW,我第一次用它。:)本地化进口是一回事。PEAKS导入LazyImport工具怎么样?@SenthilKumaran是这个问题的重点,以促进PEAKS?@Marcin-不,请。不要误解。这是对“为什么”问题的唯一正确答案。然而,python当然应该支持像“import'lazy'”这样的一流特性。。。另一个原因是,有时你想在程序调用函数之前知道模块是否损坏。