gpt4 book ai didi

python - 从实例方法定义的 Jupyter magic

转载 作者:行者123 更新时间:2023-12-01 09:06:15 25 4
gpt4 key购买 nike

我正在编写一个类,该类在进程完成时向用户发送松弛消息。我认为提供 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__ 中设置)。有什么办法可以做到这一点吗?

这里有一些我不想实现的解决方案,除非我真的必须这样做:

  1. 使用实例作为参数注册一个常规函数。我不想将该行代码添加到笔记本中,我想使用实例方法
  2. 注册一个动态构造实例的常规函数​​。

最佳答案

这是我能想到的最好的办法,它在我不想做的事情列表中排名第一。

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
...

关于python - 从实例方法定义的 Jupyter magic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52021372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com