启动ipython内核发生错误_有什么方法可以在IPython重新加载后手动修复`super()`的操作(避免TypeError)?...

这是引发我遇到的问题的人为玩具示例:

我有几个类,假设它们在本地文件“ issue.py”中:

class A(object):

def save(self):

# fancy stuff

pass

class B(A):

def save(self):

# misc stuff

super(B, self).save()

class C(B):

pass

我在IPython会话中使用它们,也许像这样:

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from issue import A, B, C

In [4]: c = C()

In [5]: c.foo = 'whatever'

In [6]: c.save()

到现在为止还挺好.但是后来我意识到A类’fancy-stuff’中存在一个错误,并在那里进行了少量编辑–甚至可能只是添加了一些日志记录.然后,我想重复一下save():

In [7]: c.save()

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in ()

----> 1 c.save()

/Users/scratch/Documents/dev2015/gensim_venv/src/gensim-develop/docs/notebooks/scratch~/issue.py in save(self)

7 def save(self):

8 # misc stuff

----> 9 super(B, self).save()

10

11 class C(B):

TypeError: super(type, obj): obj must be an instance or subtype of type

不好了!.重新加载类后,可怕的TypeError异常,而较旧的实例保留了一些较旧的超类! SO和其他地方都在讨论此问题,但没有明确的恢复方法.

但是碰巧的是,我真的很希望能够在旧的c实例上运行稍微更新过的A.save(). (我的内存中有20GB的数据,大约需要一天半的时间才能生成,这些数据将通过超类方法以首选方式保存.我已经通过其他手动方法保存了足够多的数据,我认为我能够在重新启动的IPython内核中重建c.但是,尽管我仍然拥有可靠的对象,但我还是更喜欢对修补的A.save()进行真实的测试-甚至可以进行更多修复/在完全重启内核之前对其进行测试.)

因此,我对任何策略或技巧都感兴趣,无论它们在其他情况下有多么不明智,都将c一直强制到当前的类定义中,以便c.save()可以正常工作.

有任何想法吗?

我希望所有适用于此玩具示例的东西都可以在我的实际设置中使用,这是基于CPython 2.7.10的IPython). (但是,在实际情况下,这三个类位于不同的文件中.)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值