牛の一歩も、一歩は一歩

日々の関心、備忘録などをまとめる.

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()
def hoge():        
    a="hoge"
    ic(a)