我认为这篇文章应该对您有帮助
编辑:为了确保此信息的可用性(如果链接消失或类似原因),我将在此处包括来自教师邮件列表的原始消息:
Dick Moores在2006年8月14日写道:
实际上,我的问题是,在使用IDLE进行模块的一些导入和变量的初始化之后,如何将其返回到其初始状态而不关闭并重新打开它。
因此,例如,在我完成之后
>>> import math, psyco
>>> a = 4**23
我如何清除这些而不关闭IDLE?(我曾经知道如何,但是我已经忘记了。)
嗨,迪克,
通常,这需要从“模块注册表”中删除并在代码中删除对其的引用。如果您有一个使用 得很 好的模块(例如将配置参数导入到每个模块中的模块),那么您将有一个额外的步骤将其从同样,如果您使用了“ from psyco import …”,那么您将无法轻松释放该模块以及对该模块的引用(是从该模块导入,还是从第三个模块导入?请参阅“如果偏执狂:下面的代码)。
下面的函数从Python解释器中按名称删除模块,“ paranoid”参数是要从其他所有模块中删除的变量名的列表(假定已与该模块一起删除)。对偏执的参数要非常小心;如果您的函数和类在不同的模块中被命名为相同的名称,则可能会对解释器造成问题。一种常见的情况是例外情况下的“错误”。许多库在模块中都有一个称为“错误”的“包罗万象”异常。如果您也将异常命名为“错误”并决定将其包括在偏执狂列表中,那么……还有很多其他异常对象。
def delete_module(modname, paranoid=None):
from sys import modules
try:
thismod = modules[modname]
except KeyError:
raise ValueError(modname)
these_symbols = dir(thismod)
if paranoid:
try:
paranoid[:] # sequence support
except:
raise ValueError('must supply a finite list for paranoid')
else:
these_symbols = paranoid[:]
del modules[modname]
for mod in modules.values():
try:
delattr(mod, modname)
except AttributeError:
pass
if paranoid:
for symbol in these_symbols:
if symbol[:2] == '__': # ignore special symbols
continue
try:
delattr(mod, symbol)
except AttributeError:
pass
然后,您应该可以像这样使用它:
delete_module('psyco')
要么
delete_module('psyco', ['Psycho', 'KillerError'])
# only delete these symbols from every other module
# (for "from psyco import Psycho, KillerError" statements)
-弓箭