代码之家  ›  专栏  ›  技术社区  ›  Nolan Conaway

Jupyter Magic从实例方法定义

  •  1
  • Nolan Conaway  · 技术社区  · 7 年前

    我正在编写一个类,该类在进程完成时向用户发送可宽延消息。我认为提供一个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. 注册一个动态构造实例的常规函数。
    1 回复  |  直到 7 年前
        1
  •  1
  •   Nolan Conaway    7 年前

    这是我能想到的最好的方法,它在我不想做的事情清单上。

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