LoginSignup
3
7

pythonのprint()の上位互換icecreamが使いやすい話

Posted at

使いやすい

お恥ずかしながらたまにデバッグモード使うのもめんどくさいとき、printに頼った経験は皆さんも多々あると思いますが、loggerとかと併用してたり、print文がそもそも多かったりすると、どの行のprintがどの出力かわかんなかったりします。

def multiply(a, b):
    return a * b

print(multiply(1, 2))
print(multiply(3, 4))
print(multiply(4, 5))
print(multiply(5, 6))
print(multiply(6, 7))
print(multiply(7, 8))
print(multiply(8, 9))

出力

6
12
20
30
42
56
72

「上から5行目だから、、、1,2,3....」

その対策として、以下のようにする人もいるかもしれません。(私です)

print(multiply(6, 7), '5行目')

これいちいち書くの面倒ですし、誰にも見られたくないですよね。

そこで皆さん

pip install icecream

しましょう。

何が良いって、何の出力化も明示してくれるところです。しかもカラフル。

image.png

しかも一行で2つ出力しても何を出力しているかちゃんと教えてくれる。

# loggingの例
logger = logging.getLogger()
ic(logger, type(logger))

出力
image.png

ちゃんと改行して、

 logger: 
 type(logger): 

という風に、何の出力か教えてくれます。
これいいよね。

辞書もお手の物

以下のような辞書をicecreamで出力してみます。

data = {
  "products": [
    {
      "name": "T-shirt",
      "details": {
        "color": "blue",
        "size": "medium",
        "material": "cotton"
      }
    },
    {
      "name": "Jeans",
      "details": {
        "color": "black",
        "size": "32",
        "material": "denim"
      }
    },
    {
      "name": "Sneakers",
      "details": {
        "color": "white",
        "size": "10",
        "material": "leather"
      }
    },
    {
      "name": "Backpack",
      "details": {
        "color": "gray",
        "size": "large",
        "material": "nylon"
      }
    },
    {
      "name": "Watch",
      "details": {
        "color": "silver",
        "size": "one-size",
        "material": "stainless steel"
      }
    }
  ]
}

出力

image.png
インデントはともかく、まあ悪くない

引数なしでも便利

ある関数を定義して、その関数が実行されているか、またはどこまで到達しているかを引数なしのic()で確認することができます。引数なしとありを組み合わせると、結構パワフルですよね。

ic.disable() と ic.enable() 関数によって、デバッグ出力のオン/オフを簡単に切り替えることができます。

def add_and_subtract(a, b):
    addition = a + b
    ic()
    ic(addition)
    subtraction = a - b
    return addition, subtraction

def main():
    add_and_subtract(10, 5)
    add_and_subtract(20, 15)
    ic.disable()
    add_and_subtract(30, 25) # この行はprintされなくなる
    ic.enable()
    add_and_subtract(40, 35)

if __name__ == '__main__':
    main()

出力
image.png

このようにic() は出力に変数名や式を含めるため、デバッグ情報がどのコード行から来たのかが明確になります。

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7