2016-03-01 6 views
0

Я сохраняю переменную информацию внутри встроенного модуля, и я хочу очистить всю информацию о переменной, которая хранится внутри нее. Я не могу понять, как это сделать.Как перезагрузить модуль Python? Очистка переменной информации

import importlib 
import builtins 
print("add" in dir(builtins)) 
builtins.add = "x" 
print("add" in dir(builtins)) 
importlib.reload(builtins) 
print("add" in dir(builtins)) 

Это не работает.

+6

«Я хранил переменную информацию внутри встроенного модуля» - jesus crap, *** why ***? – user2357112

+0

'builtins' не является нормальным модулем. Он загружается как часть основного интерпретатора; Я сомневаюсь, что «перезагрузка» на самом деле делает что-то значимое для него. – ShadowRanger

+3

BTW, за [docs] (https://docs.python.org/3/library/importlib.html#importlib.reload): «Как правило, не очень полезно перезагружать встроенные или динамически загружаемые модули. 'sys',' __main__', 'builtins' и другие ключевые модули не рекомендуется. Во многих случаях модули расширения не предназначены для инициализации более одного раза и могут перезагружаться произвольно." – ShadowRanger

ответ

1

reload не очищает модуль __dict__ до его перезагрузки, поэтому перезагрузка модуля не влияет на любые имена, которые вы добавляете к нему, которые не были первоначально частью модуля.

Как правило, всегда лучше избегать возиться с модулем builtins, чем пытаться восстановить его после того, как он возился с ним. Тем не менее, если вы действительно хотите сделать это, сохраните копию builtins.__dict__ прежде, чем возиться с ним, так что вы можете восстановить из резервной копии позже:

# Before screwing with builtins: 
builtins_backup = builtins.__dict__.copy() 

# After screwing with builtins: 
builtins.__dict__.clear() 
builtins.__dict__.update(builtins_backup) 

Это не собирается быть поточно, если другой поток приходит между clear и update, но попытка перезагрузить builtins вряд ли находится в безопасной зоне.

+0

aah, это имеет смысл. Я ценю это много! Это, как говорится, кажется невероятно неустойчивым и, по вашему мнению, кажется неправильной практикой. Я буду использовать эту функцию перед фронтом до того, как придумаю более стабильное решение. – btomtom5