如何在“from <module> import *”之后重新加载?
我可以通过正常导入的方式简单地重新加载模块(使用 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 *
通常是不被推荐的,因为这样做会让代码变得不太容易阅读:
一般来说,从一个模块或包中导入所有内容是不太被提倡的,因为这往往会导致代码可读性差。不过,在交互式会话中使用它来减少输入是可以的。