2024-09-26 18:00:09 发布
网友
在交互模式下使用python可以导入一个模块,如果该模块发生了更改(bug修复或其他),则可以简单地使用reload()命令。在
但是如果我没有导入整个模块,并使用'from M import f,g'import语句呢。有没有办法只重新导入g?在
(我尝试通过'delg'从参数表中删除函数,并从目录中删除.pyc文件。没用。当我重新导入函数'from M import g'时,旧的g已加载)。在
当您执行from foo import bar操作时,您将导入整个模块。您只是在当前名称空间中复制符号bar。你只是在导入函数。在
from foo import bar
bar
reload函数不是完全可靠的(例如,它不能用于编译的C模块)。我建议你退出并重新启动你的口译员。在
reload
因为这只是为交互式口译员准备的,所以我不认为:
def my_reload(mod, name): reload(mod) globals()[name] = getattr(mod, name) myreload(somemodule, "some_function")
太可怕了。这只需像normal一样重新加载模块,然后将指向旧对象的名称重新绑定到新对象。这应该适用于reload开始工作的所有实例。或者,您可以对其进行编程,使其获得实际对象并使用其__name__属性获得名称。函数、类和模块都有一个__name__属性,但是像模块级字典这样的东西就没有了,所以它就没有那么灵活了。在
__name__
它不会替换对除全局对象以外的对象的引用,但reload也不会,即使您最初是用虚线名称访问它的。一旦一个对象的引用是松散的,你就无能为力了。在
对于from M import f, g,其中M不是正式的python模块,请使用:
from M import f, g
M
import sys import importlib importlib.reload(sys.modules['M'])
然后,使用以下方法重新导入f和{}:
f
如果M是一个正式的python模块,请使用
import importlib importlib.reload(M) from M import f,g
当您执行
from foo import bar
操作时,您将导入整个模块。您只是在当前名称空间中复制符号bar
。你只是在导入函数。在reload
函数不是完全可靠的(例如,它不能用于编译的C模块)。我建议你退出并重新启动你的口译员。在因为这只是为交互式口译员准备的,所以我不认为:
太可怕了。这只需像normal一样重新加载模块,然后将指向旧对象的名称重新绑定到新对象。这应该适用于
reload
开始工作的所有实例。或者,您可以对其进行编程,使其获得实际对象并使用其__name__
属性获得名称。函数、类和模块都有一个__name__
属性,但是像模块级字典这样的东西就没有了,所以它就没有那么灵活了。在它不会替换对除全局对象以外的对象的引用,但
reload
也不会,即使您最初是用虚线名称访问它的。一旦一个对象的引用是松散的,你就无能为力了。在对于
from M import f, g
,其中M
不是正式的python模块,请使用:然后,使用以下方法重新导入}:
^{pr2}$f
和{如果
M
是一个正式的python模块,请使用相关问题 更多 >
编程相关推荐