Python:如何重新加载使用*导入的模块
我知道如果我通过名字导入一个模块,比如用 import(moduleName)
,那么我可以用 reload(moduleName)
来重新加载它。
但是,我现在是用一个 Kleene 星号导入一堆模块:
from proj import *
在这种情况下,我该怎么重新加载它们呢?
2 个回答
0
这是一个复杂而让人困惑的问题。我提供的方法会重新加载模块,并在特定的环境中刷新变量。不过,如果你有多个模块使用了星号导入(也就是一次性导入所有内容),那么这些模块会保留它们原来的值,而不是更新。这种情况下,这个方法就会失效。一般来说,重新加载模块并不是一个好习惯,除非你在使用REPL(交互式编程环境)。模块不应该是动态的,你应该考虑其他方法来提供你需要的更新。
import sys
def reload_starred(module_name, context):
if context in sys.modules:
context = vars(sys.modules[context])
module = sys.modules[module_name]
for name in get_public_module_variables(module):
try:
del context[name]
except KeyError:
pass
module = reload(module)
context.update(get_public_module_variables(module))
def get_public_module_variables(module):
if hasattr(module, "__all__"):
return dict((k,v) for (k,v) in vars(module).items()
if k in module.__all__)
else:
return dict((k,v) for (k,v) in vars(module).items()
if not k.startswith("_"))
用法:
reload_starred("my_module", __name__)
reload_starred("my_module", globals())
reload_starred("my_module", "another_module")
def function():
from my_module import *
...
reload_starred("my_module", locals())
1
我觉得有办法重新加载所有的Python模块。下面是Python 2.7的代码示例:与其用星号导入整个数学模块,不如只导入你需要的部分。
from math import *
from sys import *
Alfa = modules.keys()
modules.clear()
for elem in Alfa:
str = 'from '+elem+' import *'
try:
exec(str)
except:
pass