重新加载模块,需要重新编译子模块吗?

4
抱歉,我知道这个问题被问了很多次,但我找不到它。
在myModule.py中:
from myModule.subModule import myClass

我正在处理myClass,并希望留在我的ipython会话中测试它。reload(myModule)无法重新编译myClass。
我该如何做?
1个回答

2

在重新加载“leafmost”子模块后,您需要重复导入。例如,给定:

$ mkdir myModule
$ touch myModule/__init__.py
$ cat >myModule/subModule.py
class MyClass(object): kind='first'

然后

>>> from myModule.subModule import MyClass
>>> MyClass.kind
'first'

在另一个终端中

$ cat >myModule/subModule.py
class MyClass(object): kind='second'

then...:

>>> import sys
>>> reload(sys.modules['myModule.subModule'])
<module 'myModule.subModule' from 'myModule/subModule.py'>
>>> from myModule.subModule import MyClass
>>> MyClass.kind
'second'

由于您没有子模块的引用,因此需要通过 sys.modules 进行操作,并且需要重复使用 from。请注意保留 HTML 标签。

当然,如果您始终导入一个模块而不是模块内部的内容,那么生活将会更加简单 - 例如,Python 会话将如下所示(在重新加载之前更改子模块):

>>> from myModule import subModule as sm
>>> sm.MyClass.kind
'first'
>>> reload(sm)
<module 'myModule.subModule' from 'myModule/subModule.py'>
>>> sm.MyClass.kind
'second'

如果你养成使用限定名称(例如sm.MyClass)而不是仅使用裸名字(MyClass)的习惯,那么在许多方面你的生活将更加简单(更容易重新加载只是其中之一;-)。


我的类没有kind属性。可能是Python 3.0的问题(我使用的是2.6.4)。无论如何,我按照您的建议使用了子模块的限定名称,一切都正常工作了。非常感谢。我也很喜欢您的《Python Cookbook》书籍。 Alex - alex
@alex,我定义了一个属性,只是为了使验证加载的类的版本变得最简单和最容易 -- 属性的名称和值没有什么特别之处,只是一个例子。 - Alex Martelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接