处理对象重新加载的最佳方法,而不是模块

时间:2010-07-21 19:17:45

标签: python import module reload ipython

我在IPython中进行了大量的开发

In[3]: from mystuff import MyObject

然后我在mystuff.py中进行了很多更改。为了更新命名空间,我必须做

In[4]: reload(mystuff)
In[5]: from mystuff import MyObject

有更好的方法吗?请注意,我无法通过引用mystuff直接导入MyObject,就像

一样
In[6]: import mystuff
In[7]: mystuff.MyObject

因为这不是它在代码中的工作方式。更好的方法是在我写文件时让IPython 自动执行(但这可能是另一个问题)。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用IPython中的deep_reload功能执行此操作。

http://ipython.scipy.org/doc/manual/html/interactive/reference.html?highlight=dreload

如果您使用-deep_reload参数运行ipython来替换普通的reload()方法。

如果那样做没有你想要的,那么就可以编写一个脚本来自动替换作用域中所有导入的模块。虽然相当hacky,但它应该工作;)

我刚刚找到了ipy_autoreload模块。也许这可以帮助你一点。我还不确定它是如何工作的,但这应该按照文档工作:

import ipy_autoreload
%autoreload 1

答案 1 :(得分:0)

如果对象是类或函数,则可以使用其__module__属性来确定要重新加载的模块:

def reload_for(obj):
    module = reload(__import__(obj.__module__, fromlist=True))
    return getattr(module, obj.__name__)

MyClass = reload_for(MyClass)

答案 2 :(得分:0)

尝试使用%run magic导入正在编辑的文件的内容。当您使用它从文件导入对象时,它会在每次运行它时更新这些对象。这样,每次回程都不会自动加载。