Ipython自定义魔术命令:官网实例+保存自定义magic+以函数的形式调用magic

前言

在使用jupyter notebook的过程中,经常有些代码,有些需求是可重用的,这当然可以使用snippets代码段插件解决,但是不够python。每次见到一堆重复的代码,特别是需要自定义一些参数的时候,甚是有点嫌弃。因此,找些资料,尝试自定义自己的魔术命令。

准备知识

魔术命令的分类

  • 行(line)魔术命令,形如:%run /%timeit,参数(若有)都在一行。
  • 单元格(cell)魔术命令,形如:%%javascript/%%timeit,参数为整个单元格,分为在魔术命令同行传入的可选项,单元格余下部分的cell body
  • 可以注意到,这里的timeit即可以是行魔术命令,也可以是单元格命令。

代码示例

官网中提供了两种自定义魔术命令的模版,亲测效果都一样。

法一:装饰器+函数

jupyter notebook中建一单元格,输入以下代码即可。

from IPython.core.magic import (register_line_magic, register_cell_magic,
                                register_line_cell_magic,)
@register_line_magic  # 行魔术命令
def lmagic(line):
    "my line magic"
    return line

@register_cell_magic # 单元魔术命令,line为首行输入的可选项
def cmagic(line, cell):
    "my cell magic"
    return line, cell

@register_line_cell_magic #混搭
def lcmagic(line, cell=None):
    "Magic that works both as %lcmagic and as %%lcmagic"
    if cell is None:
        print("Called as line magic")
        return line
    else:
        print("Called as cell magic")
        return line, cell
        
 del lmagic,cmagic,lcmagic # 防止被automagic采集到,使得只能 %lmagic形式调用

在这里插入图片描述

法二:类修饰符

效果一样。

from __future__ import print_function
from IPython.core.magic import (Magics, magics_class, line_magic,
                                cell_magic, line_cell_magic)
                                
@magics_class
class MyMagics(Magics):

    @line_magic
    def lmagic(self, line): # 行魔术命令
        "my line magic"
        print("Full access to the main IPython object:", self.shell) # 可以控制整个ipython内核
        # #整个命名空间的变量
        # #同在ipython中的get_ipython().kernel.shell.user_ns.keys()==get_ipython().user_ns.keys() 
        # print("Variables in the user namespace:", list(self.shell.user_ns.keys()))
        return line

    @cell_magic
    def cmagic(self, line, cell):
        "my cell magic"
        return line, cell

    @line_cell_magic
    def lcmagic(self, line, cell=None):
        "Magic that works both as %lcmagic and as %%lcmagic"
        if cell is None:
            print("Called as line magic")
            return line
        else:
            print("Called as cell magic")
            return line, cell
                 
# 注册魔术命令
ip = get_ipython()
ip.register_magics(MyMagics)

在这里插入图片描述

最后一步

通过上面的例子,已经了解到魔术命令的定义形式,以及接受到的参数是什么。
但是,如果我们想在ipython中像自如的像%timeit一样使用,还是有点问题。
因为,上面两种方式的注册魔术命令都只是暂时的,重新启动的ipython,自建魔术命令还是得重新输入

如何保存自定义magic

  1. 一种是将定义magic的代码存为.py文件,每次运行iptython的时候,手动导入一遍即可。
    比如:(QY_ipyautorun.py为magic申明定义代码)

from QY_ipyautorun import *

  1. 如果,懒得每次导入,在jupyter notebook中可以定义一个snippets代码段,每次点一下也可以。
  2. 如果点一下也不可以,直接将上面的导入代码,或者直接将定义代码的.py文件,放入.ipython\profile_default\startup目录:
    startup目录下的文件,每次ipython运行之前都会被运行一遍

C:\Users\Administrator\.ipython\profile_default\startup\QY_ipyautorun.py

以函数的形式调用magic

有些时候,在ipythonjupyter notebook中想以函数的形式调用magic,当然即包括自己定义的,也包括系统的命令:

ipy = get_ipython()
# 指定运行魔术命令
ipy.run_line_magic('history', '6 7 3-4')

#
ipy.find_line_magic('history')

参考资料

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值