为啥你永远不应该重新加载模块? [复制]
Posted
技术标签:
【中文标题】为啥你永远不应该重新加载模块? [复制]【英文标题】:Why are you never supposed to reload modules? [duplicate]为什么你永远不应该重新加载模块? [复制] 【发布时间】:2015-12-27 21:34:56 【问题描述】:在"Modules and Packages: Live and Let Die!",第28页(另见the video),据说:
你可以强制重新加载一个模块,但你是 从来不应该这样做。
谁能解释为什么我们不应该在 Python 中重新加载模块?
【问题讨论】:
重新加载模块?你的意思是两次导入一个模块? 第一条规则:如果可能并且您需要它,请三思而后行。唯一的例外可能是为核弹编程软件。然后三思而后行。 【参考方案1】:这里详细解释重载:How do I unload (reload) a Python module?
tl;rd
reload
有一些有效的用例,例如 Django 开发服务器。但总的来说,重新加载模块有太多需要注意的地方。
两个最大的问题是:
要完全卸载旧对象,您必须确保没有其他模块或对象保留对它们的引用(这通常是不可能的)。如果您在此处失败,您可能会遇到难以追踪的内存泄漏或意外行为。
没有通用的方法来重新加载带有 C 扩展的模块。有些可能会安全地重新加载;有些似乎可以安全地重新加载,但会泄漏,有些可能会使您的解释器崩溃或产生奇怪的错误。
【讨论】:
【参考方案2】:重新加载模块是您在开发过程中通常会做的事情,因此您可以继续运行相同的解释器会话,但可以在其中获取您对模块所做的更改。这实际上在视频中进行了解释,并附有示例,来自about 11 minutes in。
但是,如果您发现自己编写的实际功能依赖于在运行时更改和重新加载的模块,那么您应该非常确定自己知道自己在做什么并首先考虑过其他选项.
【讨论】:
以上是关于为啥你永远不应该重新加载模块? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥重新部署应用后 Firebase 需要永远完成相同的功能?