2013-09-19 8 views
0

Я изменяю модуль, который содержит в нем класс.Python 3, imp.reload не имеет никакого эффекта

Когда я% запускаю другой модуль, который использует mofified класс из IPython, изменения, похоже, не вступают в силу, если я не перезапущу IPython.

Я попытался использовать imp.reload, но это не поможет. Например, я поставил следующий код в верхней части моего модуля, но не по всей видимости, с использованием обновленной версии моего модифицированного класса (BigMySQLDatabaseGetter в модуле big_mysql_database_getter)

import imp 
import sys 
from big_mysql_database_getter import BigMySQLDatabaseGetter 
module_big_mysql_database_getter = sys.modules['big_mysql_database_getter'] 
imp.reload(module_big_mysql_database_getter) 

ответ

1

перегрузочный модуль Безразлично 't автоматически обновлять все ссылки, которые были созданы ранее, это просто переопределяет все в модуле.

Так что если вы делаете что-то вроде:

from spam import eggs 
imp.reload(spam) 
print(spam.eggs is eggs) 

вы получите False, а eggs по-прежнему ссылается на старый класс. Кроме того, экземпляры, созданные до перезагрузки являются экземплярами старого класса, а не нового класса:

import spam 
e = spam.eggs() 
imp.reload(spam) 
print(isinstance(e, spam.eggs)) # False! 

В вашем случае, вы можете либо реимпорт BigMySQLDatabaseGetter после перезагрузки модуля, или вместо того, чтобы непосредственно импортирующей классу только импорт модуль и используйте вместо него big_mysql_database_getter.BigMySQLDatabaseGetter.

+0

Работает как сон! – Ginger

Смежные вопросы