我正在编写一个类,该类在进程完成时向用户发送可宽延消息。我认为提供一个jupyter魔法会很有用,这样在执行单元时就可以通知用户。
类已经提供了一个修饰器,所以我想我只需要在修饰函数中包装一个单元执行。
from IPython.core.magic import register_cell_magic
from IPython import get_ipython
import functools
class MyClass(object):
def decorate(self, f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
r = f(*args, **kwargs)
print('Send a message here!')
return r
return wrapped
@register_cell_magic
def magic(self, line, cell):
ip = get_ipython()
@self.decorate
def f():
return ip.run_cell(cell)
return f()
所以我会这样做:
obj = MyClass()
# ----- NEW CELL
%%obj.magic
'''do some stuff'''
但我明白了
>> UsageError: Cell magic `%%obj.magic` not found.
我发现魔法是以它的名字注册的(上面,
magic
如此
%%magic
作品。但是争论都搞砸了,因为没有
self
在混合物中。
我希望魔法是一个实例方法,以便
__init__
可以使用)。有什么办法吗?
以下是一些我不想实施的黑客解决方案,除非我真的需要:
-
在实例中注册一个常规函数作为参数。我不想把那行代码加到笔记本上,
我想使用实例方法
。
-
注册一个动态构造实例的常规函数。