PySnooper は貧乏人のためのデバッガーです。 Bash を使用したことがある場合は、より凝ったものであることを除けば、Python のset -x
に似ています。
あなたのストーリー: あなたは、Python コードが期待どおりに動作しない理由を解明しようとしています。ブレークポイントや監視機能を備えた本格的なデバッガーを使いたいと思うかもしれませんが、今すぐにセットアップすることはできません。
どの行が実行されているのか、どの行が実行されていないのか、またローカル変数の値は何かを知りたいとします。
ほとんどの人は、戦略的な場所にprint
行を使用し、その一部には変数の値が表示されます。
PySnooper を使用すると、同じことを行うことができます。ただし、適切なprint
行を慎重に作成する代わりに、関心のある関数に 1 つのデコレータ行を追加するだけです。関数のプレイバイプレイ ログ (どの行を含むか) が取得されます。ローカル変数がいつ実行されたか、そして正確にいつ変更されたか。
PySnooper が他のすべてのコード インテリジェンス ツールと比べて優れている理由は何ですか?何も設定せずに、クソみたいに無秩序に広がったエンタープライズ コードベースで使用できます。以下に示すように、デコレータを適用し、最初の引数としてパスを指定して出力を専用のログ ファイルにリダイレクトするだけです。
ビットのリストを返すことによって、数値をバイナリに変換する関数を作成しています。 @pysnooper.snoop()
デコレーターを追加して、それを覗いてみましょう。
import pysnooper
@ pysnooper . snoop ()
def number_to_bits ( number ):
if number :
bits = []
while number :
number , remainder = divmod ( number , 2 )
bits . insert ( 0 , remainder )
return bits
else :
return [ 0 ]
number_to_bits ( 6 )
標準エラー出力への出力は次のとおりです。
または、関数全体をトレースしたくない場合は、関連する部分をwith
ブロックで囲むことができます。
import pysnooper
import random
def foo ():
lst = []
for i in range ( 10 ):
lst . append ( random . randrange ( 1 , 1000 ))
with pysnooper . snoop ():
lower = min ( lst )
upper = max ( lst )
mid = ( lower + upper ) / 2
print ( lower , mid , upper )
foo ()
これは次のようなものを出力します:
New var:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line 10 lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line 11 upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line 12 mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line 13 print(lower, mid, upper)
Elapsed time: 00:00:00.000344
stderr に簡単にアクセスできない場合は、出力をファイルにリダイレクトできます。
@ pysnooper . snoop ( '/my/log/file.log' )
代わりにストリームまたは呼び出し可能オブジェクトを渡すこともでき、それらが使用されます。
ローカル変数ではないいくつかの式の値を確認します。
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
関数が呼び出す関数のスヌープ行を表示します。
@ pysnooper . snoop ( depth = 2 )
その他のオプションについては、「高度な使用法」を参照してください。 <------
PySnooper をインストールする最良の方法は、Pip を使用することです。
$ pip install pysnooper
Conda と conda-forge チャネル:
$ conda install -c conda-forge pysnooper
アーチ Linux:
$ yay -S python-pysnooper
Fedora Linux:
$ dnf install python3-pysnooper
学術研究で PySnooper を使用する場合は、次の引用形式を使用してください。
@software { rachum2019pysnooper ,
title = { PySnooper: Never use print for debugging again } ,
author = { Rachum, Ram and Hall, Alex and Yanokura, Iori and others } ,
year = { 2019 } ,
month = { jun } ,
publisher = { PyCon Israel } ,
doi = { 10.5281/zenodo.10462459 } ,
url = { https://github.com/cool-RR/PySnooper }
}
Copyright (c) 2019 Ram Rachum および共同研究者、MIT ライセンスに基づいてリリース。
ハッカー ニュース スレッドと /r/Python Reddit スレッド (2019 年 4 月 22 日)