【问题标题】:Best way to handle reload-ing of objects, not modules处理对象重载的最佳方法,而不是模块
【发布时间】:2011-03-19 04:36:42
【问题描述】:

我在 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 自动 执行此操作(但这可能是另一个问题)。

任何帮助表示赞赏。

【问题讨论】:

  • 也许ipy_autoreload 扩展回答了你的两个问题:)

标签: python import module reload ipython


【解决方案1】:

您可以使用 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

【讨论】:

  • dreload 仍然只加载模块。
  • @jleedev:autoreload 命令完全符合他的需要。但你是对的,dreload() 也不够。
  • 这似乎有效!唯一的缺点是它似乎在 every 回车时重新加载(即在 IPython 中执行的 line 语句)。否则,那就太好了!
  • @reckoner 为了防止每次回车时重新加载,而不是使用%autoreload 1,只需在需要重新加载时键入%autoreload
【解决方案2】:

如果对象是一个类或者一个函数,你可以使用它的__module__属性来决定要重新加载哪个模块:

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

MyClass = reload_for(MyClass)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多