从实例方法定义的 Jupyter 魔法
Posted
技术标签:
【中文标题】从实例方法定义的 Jupyter 魔法【英文标题】:Jupyter magic defined from instance method 【发布时间】:2019-01-31 22:23:25 【问题描述】:我正在编写一个类,当进程完成时向用户发送松弛消息。我认为提供 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__
中设置)。有没有办法做到这一点?
以下是一些我不想实施的 hacky 解决方案,除非我真的必须这样做:
-
使用实例作为参数注册一个常规函数。我不想将那行代码添加到笔记本中,我想使用实例方法。
注册一个动态构造实例的常规函数。
【问题讨论】:
【参考方案1】:这是我能想到的最好的,它在我不想做的事情列表中排名第一。
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
def register_magic(self):
@register_cell_magic
def magic(line, cell):
ip = get_ipython()
@self.decorate
def f():
return ip.run_cell(cell)
return f()
然后
obj = MyClass()
obj.register_magic()
# ------
%%magic
...
【讨论】:
以上是关于从实例方法定义的 Jupyter 魔法的主要内容,如果未能解决你的问题,请参考以下文章