いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Pythonメモ-71 (printデバッグの代わりに使えるライブラリ) (icecream, ic, debug, print)

概要

とても便利なライブラリ知ったので、忘れない内にメモメモ。

github.com

READMEでまず出てくるアイスクリームちゃんがかわいい!

この時点で既にいい感じです。

どんな機能?

デバッグ時によく

print(f'somevalue={somevalue}')

とかやったりしませんか? 大体どんな言語でもやるときがあると思うのですが

このようなデバッグ出力を便利に出力させてくれるライブラリです。

勿論、通常時に利用しても全然いい感じです。

インストール

現状、condaではパッケージがありませんでした。(2018/03/27時点)

なので、pipからインストール。

$ python -m pip install icecream

依存するライブラリもないので、すんなり入りました。

基本的な使い方

この記事を書いているときに使っているバージョンは

>>> import icecream
>>> print(icecream.__version__)
1.3

です。

基本的な使い方は、README.md の方に詳しく書かれているので何も困らないのですが

一応英語なので、以下自分用のメモです。

インポート

ic()のみ利用できればいいので

from icecream import ic

としておくと楽です。ちなみにic()は関数みたいに見えますが

icecream.icecream.IceCreamDebugger クラスのインスタンスです。

__call__を実装しているので、そのまま呼び出しが出来るようになっています。

値を出力

print(f'somevalue={somevalue}')

と同じようにする場合は

ic(somevalue)

で終わりです。実行すると

ic| somevalue: xxx

と表示されます。これは便利ですね。

内部でinspectモジュールを使ってフレーム情報を取得して

呼び出し部分を取得して出力してくれています。

なので、以下のように

l = list(range(10))
ic(l[-1])

とすると、ic| l[-1]: 9 って表示してくれるし

d = dict(zip(['apple', 'banana'], [100, 200])
ic(d['apple'])

とすると、ic| d['apple']: 100 と表示してくれます。

通ったかどうかの判定用

これも古いやり方かもしれませんが、やっぱりよく使われているやり方で

def tekito():
    print(0)
    # 何か処理・・・・
    print(1)
    ・
    ・
    ・

みたいに、どこを通ったのかを出力するものです。

icecream の場合は以下のように書きます。

def tekito():
    ic()
    # 何か処理・・・・
    ic()
    ・
    ・
    ・

上記のように、引数無しでic()と書いておくと

以下の用に出力されます。

ic| icecream_sample.py:73 in debug_ic()
ic| icecream_sample.py:75 in debug_ic()

ファイルと行番号と今いる関数を出力してくれます。

print(0)とかprint('step1')とかするより有意義です。

引数の値をそのまま返してくれる

ic()に渡した値をそのまま返してくれます。

なので、処理呼び出し時に渡している変数などをデバッグする際に

呼び出し前にいちいちprint入れておかなくても、以下でいけます。

def tekito(x, y):
    return x + y

x = 10
y = 20

tekito(ic(x), ic(y))

あと、先頭についている prefix を変更できたり、出力先を制御できたり(デフォルトは stderr))など

いろいろあるのですが、詳しくは 以下のちょこっと作ったサンプルや github の README などを参照ください。

サンプル

以下、ちょこっと試したサンプルです。

python icecream ライブラリのサンプル (debug, print, ic, co ...

実行すると以下のようになります。

ic| hello: 'world'
ic| l01[-1]: 9
ic| d01['apple']: 100
ic| s01.pop(): 0
ic| dat1: Data1(x=100, y=200)
0
1
2
ic| icecream_sample.py:73 in debug_ic()
ic| icecream_sample.py:75 in debug_ic()
ic| icecream_sample.py:77 in debug_ic()
ic| icecream_sample.py:88 in debug_ic2()- conn: None
ic| icecream_sample.py:91 in debug_ic2()- conn: Data1(x=100, y=200)
ic| icecream_sample.py:107 in debug_ic3()- conn: None
ic| icecream_sample.py:110 in debug_ic3()- conn: Data1(x=100, y=200)
ic| icecream_sample.py:111 in debug_ic3()
ic| x: 10
ic| y: 20
2018/03/27 14:35:45 |> icecream_sample.py:165 in go()
2018/03/27 14:35:45 |> dat1: Data1(x=100, y=200)
2018/03/27 14:35:45 |> icecream_sample.py:167 in go()

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。