$30 off During Our Annual Pro Sale. View Details »

IPythonマジックコマンドを作る

ShibaNyan
March 29, 2020

 IPythonマジックコマンドを作る

Jupyter Notebookは、インタラクティブにPythonなどのプログラムを実行する環境として人気があります。 Jupyter Notebookで拡張機能を作る方法としてはnbextensionsがありますが、作りたいものによっては作成方法が若干複雑です。 そこで、nbextensionsではなくIPythonのマジックコマンドを使って便利ツールを簡単に作る方法を紹介します。

ShibaNyan

March 29, 2020
Tweet

More Decks by ShibaNyan

Other Decks in Technology

Transcript

  1. IPython
    マジックコマンドを作る
    @shiba6v

    View Slide

  2. IPython,Jupyter Notebookとは
    IPython: Pythonのインタラクティブな
    実行環境.
    (Rubyで言うところのpry)
    Jupyter Notebookは,ブラウザで
    Pythonを書けるIPythonベースの実
    行環境.(右図)
    セル単位で実行

    View Slide

  3. IPythonマジックコマンドを使ってみる
    1行追加するだけで,便利機能が使える!
    例: 実行時間の計測
    この一行を追加

    View Slide

  4. 目次
    - マジックコマンドは何をしているのか
    - マジックコマンドでできること
    - マジックコマンドを作る
    - 今回の題材: import文の整理
    - 何もしないマジックコマンド
    - ライブラリの関数を持ってくる
    - その他の実装例
    - マジックコマンドの使いどころ
    - Nbextensionsとの比較

    View Slide

  5. マジックコマンドは何をしているのか
    セル内のソースコード (文字列)
    1. バイトコードに変

    2. 時間計測開始
    3. 実行
    4. 時間計測終了
    https://github.com/ipython/ipython/blob/master/IPython/core/magics/execution.py#L1184
    実行にかかった時
    間を出力
    %%time の例

    View Slide

  6. マジックコマンドは何をしているのか
    セル内のソースコード (文字列)
    https://github.com/ipython/ipython/blob/master/IPython/core/magics/execution.py#L1184
    %%time の例
    ソースコードを使って,好きな処理をできる
    1. バイトコードに変

    2. 時間計測開始
    3. 実行
    4. 時間計測終了
    実行にかかった時
    間を出力

    View Slide

  7. マジックコマンドでできること
    Pythonでできることは,マジックコマンドにできる..
    ・時間を計測
    ・time (Python), %%time (マジックコマンド)
    ・実行時プロファイルを取得
    ・cProfile (Python), %%prun (マジックコマンド)
    ・変数をシリアライズして保存
    ・pickle (Python), %store (マジックコマンド)

    View Slide

  8. IPythonのマジックコマンドを作る
    Pythonの便利ツールをマジックコマンドとして使えるように実装する.
    便利ツールが1行で使えると,開発が捗る!

    View Slide

  9. 今回の題材
    import文
    グチャグチャになりがち問題

    View Slide

  10. 今回の題材
    import文
    グチャグチャになりがち問題
    同じモジュールを何回もimport

    View Slide

  11. 今回の題材
    import文
    グチャグチャになりがち問題
    同じモジュールなのに別の場所で
    importしている

    View Slide

  12. 今回の題材
    import文
    グチャグチャになりがち問題
    自作モジュールをライブラリ
    と区別したい.

    View Slide

  13. import文を整理するPythonツール
    isort
    https://github.com/timothycrosley/isort
    $ isort src.py

    View Slide

  14. import文を整理するPythonツール
    isort
    Jupyter Notebookでもやりたい!
    https://github.com/timothycrosley/isort
    $ isort src.py

    View Slide

  15. マジックコマンド %%isort を作る
    Jupyter Notebookでも同じようなツールが欲しい・・・
    こんな感じで・・・

    View Slide

  16. 何もしないマジックコマンド
    何もしないで出力してみる

    View Slide

  17. 何もしないマジックコマンド
    何もしないで出力してみる

    View Slide

  18. 何もしないマジックコマンド
    何もしないで出力してみる

    View Slide

  19. ライブラリの関数を持ってくる
    $ isort src.py
    isort.main:main を呼んでいるこ
    とがわかる

    View Slide

  20. ライブラリの関数を持ってくる
    $ isort src.py

    View Slide

  21. マジックコマンド %%isort を作る
    できた!

    View Slide

  22. マジックコマンド %%isort を作る
    ちょっとリッチな出力も
    できる.

    View Slide

  23. マジックコマンド %%isort を作る
    Pythonスクリプトとして書いて
    ,importすればきれいに!

    View Slide

  24. マジックコマンド %%isort を作る
    作り方説明 終わり

    View Slide

  25. その他の実装例
    shape_commentator
    行列の次元をコメントとして
    付けてくれる (自作ツール)
    内部的にはASTをいじって
    実行している.
    https://github.com/shiba6v/shape_commentator

    View Slide

  26. その他の実装例
    mypy
    Pythonで
    静的型チェック
    https://github.com/shiba6v/mypy_ipython

    View Slide

  27. マジックコマンドの使いどころ
    なぜマジックコマンドを作りたかったか?
    .pyファイルにしか適用できない便利ツールをJupyterでも使いたい!

    View Slide

  28. マジックコマンドの使いどころ
    マジックコマンドの悪い点
    Pythonファイルに変換した時に,
    読みづらくIPython環境なしでは実行できない
    $ jupyter nbconvert --to script src.ipynb

    View Slide

  29. Nbextensionsとの比較
    Nbextensions: Jupyter Notebookの拡張機能 (公式)
    JavaScriptで作る.

    View Slide

  30. Nbextensionsとの比較
    IPythonマジックコマンド Nbextensions
    主に使う言語 Python JavaScript

    View Slide

  31. Nbextensionsとの比較
    IPythonマジックコマンド Nbextensions
    主に使う言語 Python JavaScript
    Jupyter Notebookの
    JavaScript APIを使う
    × (できなくはないが非常にや
    りづらい)

    View Slide

  32. Nbextensionsとの比較
    IPythonマジックコマンド Nbextensions
    主に使う言語 Python JavaScript
    Jupyter Notebookの
    JavaScript APIを使う
    × (できなくはないが非常にや
    りづらい)

    作りやすさ ◯ (物によっては数行) △ (インストール・エスケープ
    処理したりといった手間 )

    View Slide

  33. Nbextensionsとの比較
    IPythonマジックコマンド Nbextensions
    主に使う言語 Python JavaScript
    Jupyter Notebookの
    JavaScript APIを使う
    × (できなくはないが非常にや
    りづらい)

    作りやすさ ◯ (物によっては数行) △ (インストール・エスケープ
    処理したりといった手間 )
    他のIPythonフロントエンド
    (IPython, Jupyter Lab,
    VSCodeなど) でも動く
    ◯ (JavaScriptでJupyter
    NotebookのAPIを使わなけ
    れば大丈夫)
    ×

    View Slide

  34. マジックコマンドで開発を加速させよう

    View Slide

  35. おわり
    - マジックコマンドは何をしているのか
    - マジックコマンドでできること
    - マジックコマンドを作る
    - 今回の題材: import文の整理
    - 何もしないマジックコマンド
    - ライブラリの関数を持ってくる
    - その他の実装例
    - マジックコマンドの使いどころ
    - Nbextensionsとの比較

    View Slide