コードをデバッグするためにprint()
またはlog()
を使用したことがありますか?もちろんそうでしょう。 IceCream (略してic
使用すると、印刷のデバッグが少し楽になります。
ic()
print()
に似ていますが、より優れています:
IceCream は十分にテストされており、寛容にライセンスされており、Python 3 と PyPy3 をサポートしています。
IceCream は主要なコントリビューターとメンテナーを探しています。 IceCream を率いて、Python の全員のデバッグを改善してみませんか?ぜひご連絡ください。 ?
プログラムをデバッグするために変数や式を出力したことがありますか?次のようなものを入力したことがある場合
print ( foo ( '123' ))
またはより徹底した
print ( "foo('123')" , foo ( '123' ))
そうすれば、 ic()
あなたの顔に笑顔をもたらします。引数を指定すると、 ic()
それ自体を検査し、自身の引数とそれらの引数の値の両方を出力します。
from icecream import ic
def foo ( i ):
return i + 333
ic ( foo ( 123 ))
プリント
ic| foo(123): 456
同様に、
d = { 'key' : { 1 : 'one' }}
ic ( d [ 'key' ][ 1 ])
class klass ():
attr = 'yep'
ic ( klass . attr )
プリント
ic| d['key'][1]: 'one'
ic| klass.attr: 'yep'
ic()
変数または式を指定するだけで完了です。簡単。
print()
使用して、プログラムのどの部分がどの順序で実行されるかを決定したことがありますか?たとえば、次のようなコードをデバッグするために print ステートメントを追加したことがある場合、
def foo ():
print ( 0 )
first ()
if expression :
print ( 1 )
second ()
else :
print ( 2 )
third ()
ここでもic()
役に立ちます。引数を指定しない場合、 ic()
それ自体を検査し、呼び出し元のファイル名、行番号、および親関数を出力します。
from icecream import ic
def foo ():
ic ()
first ()
if expression :
ic ()
second ()
else :
ic ()
third ()
プリント
ic| example.py:4 in foo()
ic| example.py:11 in foo()
ic()
呼び出すだけで完了です。単純。
ic()
引数を返すため、 ic()
既存のコードに簡単に挿入できます。
>>> a = 6
>>> def half ( i ):
>>> return i / 2
>>> b = half(ic(a))
ic| a: 6
>>> ic(b)
ic| b: 3
ic.format(*args)
はic()
に似ていますが、出力は stderr に書き込まれるのではなく文字列として返されます。
>>> from icecream import ic
>>> s = ' sup '
>>> out = ic.format(s)
>>> print (out)
ic| s: 'sup'
さらに、 ic()
の出力は、それぞれic.disable()
とic.enable()
を使用して完全に無効にし、後で再度有効にすることができます。
from icecream import ic
ic ( 1 )
ic . disable ()
ic ( 2 )
ic . enable ()
ic ( 3 )
プリント
ic| 1: 1
ic| 3: 3
もちろん、 ic()
無効になっても引数を返し続けます。 ic()
を使用した既存のコードは壊れません。
すべてのファイルにインポートする必要がなく、すべてのファイルでic()
使用できるようにするには、それをinstall()
します。たとえば、ルートA.py
では次のようになります。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from icecream import install
install ()
from B import foo
foo ()
次に、 A.py
によってインポートされたB.py
で、 ic()
を呼び出すだけです。
# -*- coding: utf-8 -*-
def foo ():
x = 3
ic ( x )
install()
インタープリターによってインポートされたすべてのファイル間で共有されるic()
組み込みモジュールに追加します。同様に、 ic()
も後でuninstall()
することができます。
ic()
、運用環境 (開発環境ではない) など、IceCream がインストールされていない場合に正常に失敗する方法でインポートすることもできます。そのためには、次のフォールバック インポート スニペットが役に立つかもしれません。
try :
from icecream import ic
except ImportError : # Graceful fallback if IceCream isn't installed.
ic = lambda * a : None if not a else ( a [ 0 ] if len ( a ) == 1 else a ) # noqa
ic.configureOutput(prefix, outputFunction, argToStringFunction, includeContext, contextAbsPath)
ic()
の出力を制御します。
prefix
が指定されている場合、カスタム出力プレフィックスが採用されます。 prefix
次のような文字列を指定できます
>>> from icecream import ic
>>> ic.configureOutput( prefix = ' hello -> ' )
>>> ic( ' world ' )
hello -> 'world'
または関数。
>>> import time
>>> from icecream import ic
>>>
>>> def unixTimestamp ():
>>> return ' %i |> ' % int (time.time())
>>>
>>> ic.configureOutput( prefix = unixTimestamp)
>>> ic( ' world ' )
1519185860 |> 'world': 'world'
prefix
のデフォルト値はic|
です。 。
outputFunction
が指定されている場合、その文字列が stderr (デフォルト) に書き込まれるのではなく、 ic ic()
の出力を文字列として使用して、 ic()
呼び出しごとに 1 回呼び出されます。
>>> import logging
>>> from icecream import ic
>>>
>>> def warn ( s ):
>>> logging.warning(s)
>>>
>>> ic.configureOutput( outputFunction = warn)
>>> ic( ' eep ' )
WARNING:root:ic| 'eep': 'eep'
argToStringFunction
が指定されている場合は、引数値を指定して呼び出され、表示可能な文字列にシリアル化されます。デフォルトは PrettyPrint の pprint.pformat() ですが、これを変更して、たとえばカスタム方法で非標準のデータ型を処理することができます。
>>> from icecream import ic
>>>
>>> def toString ( obj ):
>>> if isinstance (obj, str ):
>>> return ' [!string %r with length %i !] ' % (obj, len (obj))
>>> return repr (obj)
>>>
>>> ic.configureOutput( argToStringFunction = toString)
>>> ic( 7 , ' hello ' )
ic| 7: 7, 'hello': [!string 'hello' with length 5!]
デフォルトのargToStringFunction
はicecream.argumentToString
で、 functools.singledispatch
を使用して特定のクラスにディスパッチされる関数をregister
およびunregister
メソッドがあります。登録された関数を表示するためのregistry
プロパティもあります。
>>> from icecream import ic, argumentToString
>>> import numpy as np
>>>
>>> # Register a function to summarize numpy array
>>> @ argumentToString.register(np.ndarray)
>>> def _ ( obj ):
>>> return f " ndarray, shape= { obj.shape } , dtype= { obj.dtype } "
>>>
>>> x = np.zeros(( 1 , 2 ))
>>> ic(x)
ic| x: ndarray, shape=(1, 2), dtype=float64
>>>
>>> # View registered functions
>>> argumentToString.registry
mappingproxy({object: <function icecream.icecream.argumentToString(obj)>,
numpy.ndarray: <function __main__._(obj)>})
>>>
>>> # Unregister a function and fallback to the default behavior
>>> argumentToString.unregister(np.ndarray)
>>> ic(x)
ic| x: array([[0., 0.]])
includeContext
指定され、True の場合、 ic()
呼び出しのファイル名、行番号、および親関数がic()
の出力に追加されます。
>>> from icecream import ic
>>> ic.configureOutput( includeContext = True )
>>>
>>> def foo ():
>>> i = 3
>>> ic(i)
>>> foo()
ic| example.py:12 in foo()- i: 3
includeContext
デフォルトで False です。
contextAbsPath
が指定され、 True の場合、 includeContext == True
でic()
が呼び出されたときに、 foo.py
などのファイル名だけでなく、 /path/to/foo.py
などの絶対ファイルパスが出力されます。これは、同じファイル名を共有する複数のファイルをデバッグする場合に便利です。さらに、VSCode などの一部のエディターは、絶対ファイルパスをクリック可能なリンクに変換し、 ic()
が呼び出されたファイルを開きます。
>>> from icecream import ic
>>> ic.configureOutput( includeContext = True , contextAbsPath = True )
>>>
>>> i = 3
>>>
>>> def foo ():
>>> ic(i)
>>> foo()
ic| /absolute/path/to/example.py:12 in foo()- i: 3
>>>
>>> ic.configureOutput( includeContext = True , contextAbsPath = False )
>>>
>>> def foo ():
>>> ic(i)
>>> foo()
ic| example.py:18 in foo()- i: 3
contextAbsPath
デフォルトで False です。
IceCream を pip でインストールするのは簡単です。
$ pip install icecream
ic()
@alexmojakiによるexecuting
を使用して、Python ソース内のic()
呼び出しを確実に見つけます。それは魔法です。
おいしいアイスクリームはどの言語でも楽しめるはずです。
好きな言語で同様のic()
関数が必要な場合は、プル リクエストを開いてください。 IceCream の目標は、あらゆる言語で便利なic()
関数を使用して印刷デバッグを容易にすることです。