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')

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章