Python 3,imp.reload似乎没有任何效果

时间:2013-09-19 13:42:04

标签: python-3.x ipython

我正在修改一个包含类的模块。

当我运行另一个使用来自IPython的mofified类的模块时,除非重新启动IPython,否则更改似乎不会生效。

我曾尝试使用imp.reload,但这没有帮助。例如,我将以下代码放在我的模块顶部,但它似乎没有使用我修改的类的更新版本(big_mysql_database_getter模块中的BigMySQLDatabaseGetter)

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 个答案:

答案 0 :(得分:1)

重新加载模块不会自动更新之前创建的所有引用,它只是重新定义了模块中的所有内容。

所以,如果你做了类似的事情:

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