代码之家  ›  专栏  ›  技术社区  ›  reckoner

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

  •  2
  • reckoner  · 技术社区  · 14 年前

    我在IPython做了很多开发工作,

    In[3]: from mystuff import MyObject
    

    然后我在mystuf.py中做了很多改变。为了更新名称空间,我必须这样做

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

    有更好的方法吗?注意,我不能通过直接引用mystuf导入myObject

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

    因为这不是代码中的工作方式。最好是拥有伊普生 自动地 当我写文件的时候就这样做(但这可能是另一次的问题)。

    感谢您的帮助。

    3 回复  |  直到 10 年前
        1
  •  3
  •   Wolph    14 年前

    你可以使用 deep_reload 这是ipython的特色。

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

    如果你用 -deep_reload 替换正常值的参数 reload() 方法。

    如果这不符合您的要求,就可以编写一个脚本来自动替换作用域中所有导入的模块。虽然相当老套,但它应该管用;)

    我刚发现 ipy_autoreload 模块。也许这对你有点帮助。我还不确定它是如何工作的,但这应该根据文档来工作:

    import ipy_autoreload
    %autoreload 1
    
        2
  •  0
  •   Josh Lee krisdigitx    14 年前

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

    def reload_for(obj):
        module = reload(__import__(obj.__module__, fromlist=True))
        return getattr(module, obj.__name__)
    
    MyClass = reload_for(MyClass)
    
        3
  •  0
  •   meatcomputer    10 年前

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