如何在“from <module> import *”之后重新加载?

4 投票
1 回答
1754 浏览
提问于 2025-04-17 22:34

我可以通过正常导入的方式简单地重新加载模块(使用 imp.reload(模块或别名))。但是,如果我使用了“from 模块 import *”这种方式导入,能不能重新加载所有的内容呢?

使用 imp.reload(模块) 这样的方法不行,它会提示“名称:模块未定义”。

1 个回答

9

当你使用 from module import * 这条命令时,模块里的所有内容都会被加载到你当前的工作环境中,最后对 module 的引用会被移除。不过,由于模块会被缓存,你仍然可以通过 sys.modules 访问这个模块对象,这样如果你之后再进行导入,就不需要重新加载这个模块了。

也就是说,如果你想实现你期待的效果,可以这样做:

import sys
from foo import *
print A, B        #prints 1, 2
A, B = 100, 200
mod = reload(sys.modules['foo'])#use imp.reload for Python 3  
vars().update(mod.__dict__)     #update the global namespace
print A, B        #prints 1, 2

顺便提一下,使用 import * 通常是不被推荐的,因为这样做会让代码变得不太容易阅读

一般来说,从一个模块或包中导入所有内容是不太被提倡的,因为这往往会导致代码可读性差。不过,在交互式会话中使用它来减少输入是可以的。

撰写回答