pythonのicecreamを調べてみた
icecream
ideをどうしても使いたくない、logging, printでデバッグしたいという頑固ものにうってつけのパッケージ。 というかそういう層以外に、需要なさげ。 以下、readmeの簡単なまとめと個人的な意見をまとめる。
内容のverは2.0.0
。git hubはhttps://github.com/gruns/icecream。
TL;DR
- インタラクティブでは使えない
- printの代わりにicecreamを使うと変数名と変数の値が出力される
- 関数内の条件分岐のデバッグ簡単
- icecreamによる出力を一括で有効,無効化できる
- main scriptでicecreamのメソッドを実行するだけで、同プロジェクト内のスクリプトでもicが使える(2021年1月20日; ver2.0.0;ではpythonのver次第で実行できない)
インタラクティブ
試してみようかと思ってインタラクティブでやってみたが使えなかった。スクリプトを書く前提<-まあ困らん
>>> from icecream import ic >>> a=None >>> print(a) None >>> ic(a) ic| Error: Failed to access the underlying source code for analysis. Was ic() invoked in an interpreter (e.g. python -i), a frozen application (e.g. packaged with PyInstaller), or did the underlying source code change during execution?
printの代用
icecreamを,使うことで、変数の値のprintと同時に、変数名まで表示。デバッグで数値とその数値がどの変数のものかをわざわざprint文で書いたり、関数化する手間を省いてくれる点は便利。
from icecream import ic a="hoge" ic(a)
ic| a: 'hoge'
パッケージの中身を全く見てないので確証はないが、どうやらicの括弧内のテキスト情報を読み込んで,表示しているだけのようなので、関数、無名関数、リストでも同様に表示される。
- 普通の関数
from icecream import ic def hoge(a): return "hoge" a=None ic(hoge(a))
ic| hoge(a): 'hoge'
- 無名関数
from icecream import ic hoge=lambda a: "hoge" a=None ic(hoge(a))
ic| hoge(a): 'hoge'
- リスト
from icecream import ic hoge=["hoge", "fuga"] ic(hoge[0]) ic(hoge)
ic| hoge[0]: 'hoge' ic| hoge: ['hoge', 'fuga']
- attribute
from icecream import ic class Hoge(): a="hoge" hoge=Hoge() ic(hoge.a)
ic| hoge.a: 'hoge'
分岐に入っているか、どこまで動作したかの確認
ide使いたくない、Debugger使うより…ry の民は、基本的に条件に正しく入っているかどうかやエラーで止まった際、どこまで正しく動作していたのかをprintを使って確認しがち(俺だけか?). プログラムの至る所にprint("hoge1"), print("hoge2"), ...
と現在プログラムのどこにいるのかわかる様に連番でprintしてゆく手間を軽減
なお動作するのは、関数内のみの模様なので、簡単な単体テストのときなどに用いると、便利そう
from icecream import ic def hoge(a): ic() if a: ic() else: ic() print("\n") hoge(0) hoge(1)
ic| tmp.py:3 in hoge() at 04:30:44.835 ic| tmp.py:7 in hoge() at 04:30:44.836 ic| tmp.py:3 in hoge() at 04:30:44.837 ic| tmp.py:5 in hoge() at 04:30:44.838
icの無効化
一括で、あるコード以降のicによる出力を停止。再開も可能。正直、使い道が、プログラムが完成した際に書かれているテスト用のprintを消す手間の軽減ぐらいしか思いつかない。どっちにしてもprintしかりicしかり、残ってるとコード的に美しくないので, 本番環境のコードに残っているのは個人的にはどうかと思う。趣味で、誰にも見せる予定のないコードとかだったりあり。
from icecream import ic ic(1) ic.disable() ic(2) ic.enable() ic(3)
ic| 1 ic| 3
importの手間が少ない
https://github.com/gruns/icecream/issues/51で報告されているように, 2021年1月20日; ver2.0.0;現在ではpipでインストールした場合, pythonのverが3.7.3
だと利用できなかった. 3.8.1
に変更した際, 利用できたので, pythonのverをあげる必要がある. プロジェクトによってはpython 3.7.*を使わざるを得ないことも多々あるので, どうにしかほしい.
- ディレクトリ構成
project ├ main.py └ hoge.py
- main.py
from icecream import install install() import hoge hoge.hoge()
- hoge.py
def hoge(): a="hoge" ic(a)