Ответ 1
Я думаю, этот пост должен помочь вам
изменить: чтобы обеспечить доступность этой информации (в случае, если ссылка умирает или что-то подобное), я включу исходное сообщение из списка рассылки здесь:
8/14/06, Дик Мурс писал:
Собственно, мой вопрос заключается в том, что после использования IDLE для импорта модулей и инициализации переменных, как вернуть их в начальное состояние без закрытия и повторного открытия.
Итак, например, после того, как я сделал
>>> import math, psyco >>> a = 4**23
Как я могу стереть их без закрытия IDLE? (Я знал, как, но я забыл.)
Привет, Дик,
Обычно это подразумевает удаление из "реестра модулей" и удаление ссылки на него в коде. Если у вас действительно хорошо используемый модуль (например, один с параметрами конфигурации, импортированными в каждый модуль), тогда у вас будет дополнительный шаг удаления из каждого модуля. Кроме того, если вы используете "от импорта psyco...", то вы не сможете освободить модуль и легко ссылаться на модуль (это он из этого модуля или импортирован из третий модуль? см. "если параноид: код ниже".
Функция ниже удаляет модуль по имени из интерпретатора Python, Параноидальный параметр - это список имен переменных для удаления из любого другого модуль (предположительно, удаляется вместе с модулем). Будьте ОЧЕНЬ осторожны с параноидальный параметр; это может вызвать проблемы у вашего переводчика, если функции и классы называются одинаковыми в разных модулях. Один общий это означает "ошибку" для исключений. Многие библиотеки имеют один исключение "catch-all", называемое "ошибкой" в модуле. Если вы также назвали свой исключение "ошибка" и решил включить это в параноидальный список... там перейдите много других объектов исключений.
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)
-Arcege