如何重新加载Python中的模块函数?

11 浏览
0 Comments

如何重新加载Python中的模块函数?

在关于重新加载模块的这个问题的后续中,如何重新加载已更改的模块中的特定函数?\n伪代码:\n

from foo import bar
如果 foo.py 已更改:
    重新加载 bar

0
0 Comments

Python中重新加载模块的函数是一个常见的需求,但是在Python中可靠地进行热重载并不容易。实现热重载需要编写特殊的代码,并且为了保持代码的可维护性和可读性,需要有极高的纪律性。同时,对于这样的代码进行测试也并不容易。

解决这个问题的方法是,在代码发生变化时完全重新启动Python进程。如何实现无缝重启取决于具体的问题领域。

其他相关问题和reload文档都基本上说的是同样的事情。

有人认为importlib.reload()可以很好地工作,并且在开发过程中非常有用。只需要了解它的工作原理,就不会遇到任何问题。

0
0 Comments

问题的原因是在重新加载一个模块的函数时,需要同时重新加载这个函数所在的模块以及引用了该函数的其他模块。

解决方法一:先使用reload(foo)重新加载模块foo,然后再使用reload(baz)重新加载引用了foo模块中函数的模块baz

解决方法二:在你的模块中直接使用import foo,然后每次调用函数时使用foo.bar()的形式。这样,当你使用reload(foo)重新加载模块时,将得到最新的bar函数引用。

需要注意的是,从Python 3开始,需要先通过from importlib import reload导入reload函数。

此外,还有一种解决方法是不需要先导入foo模块。详情请参考下面的回答链接。

0
0 Comments

如何在Python中重新加载模块的函数?

问题的原因是:在Python中重新加载模块的函数可能会导致一些问题,特别是在不同的Python版本中。原始的接受答案在理论上是正确的,但在实际操作中可能会出现问题,特别是在较新的Python版本中。

解决方法是:截至今天,正确的做法是使用importlib模块中的reload函数来重新加载模块的函数。具体的代码如下:

import sys, importlib
importlib.reload(sys.modules['foo'])
from foo import bar

这段代码已经在Python 2.7、3.5和3.6版本上进行了测试,并且能够正常工作。

然而,如果之前没有加载过foo模块,上述代码会引发错误。为了解决这个问题,可以使用以下代码:

importlib.reload(sys.modules.get('foo', sys))

这样做可能在某些情况下很有用,但我更倾向于保持代码的简洁性和清晰性,因为这样可以更快地给读者提供一个简明扼要的答案。

有些用户报告说上述方法对他们不起作用,并且出现了以下错误:

`AttributeError: 'module' object has no attribute 'reload'`

对于这种情况,可能是因为用户使用的Python版本较旧,不支持importlib模块中的reload函数。

重新加载模块的函数在Python中可能会引发一些问题,但使用importlib模块中的reload函数可以解决这些问题,并且能够在不同的Python版本中正常工作。

0