pythonデバッグ神器PySnooperの使用

3383 ワード

多くの子供たちが普段pythonを書く時はデバッグプログラムが必要だと信じています。問題が発生したら、関数内部はどうやって走るのかを知る必要があります。printを使うのも一つの方法ですが、迷っているところが多いと、どこでもprintを入れないといけないので、面倒くさいです。
今日はGithubで神器がオープンしました。関数の内部の動きやパラメータ値の変化、PySnooper、プロジェクトの住所が分かります。
使うのは簡単で、強大で、誰がそれのすきなことを知っていますか?PySnooperの使い方を簡単に説明します。
このツールは使いやすいです。まず直接pipを使ってインストールできます。pip install pysnooperを使う時は、各関数の前に飾り器を追加すればいいです。
簡単な例を見せたら分かります。

import pysnooper
@pysnooper.snoop()
def removeDuplicates(nums):
  """
  :type nums: List[int]
  :rtype: int
  """
  flag = 0
  i=1
  while i<len(nums):
    if nums[i]==nums[i-1]:
      flag+=1
      i+=1
      if flag>=2:
        del nums[i-1]
        i-=1
    else:
      i+=1
      flag=0
  return len(nums)

nums = [1,1,1,2]
print(removeDuplicates(nums))

装飾器を追加すると、運転コードは対応関数の実行データを出力します。
Starting var:.nums=[1,1,1,2]
13:03:44.90194コール        11 def removeDuplicates(nums):
13:03:44.90695ライン        16     フラグ=0
New var:….flage=0
13:03:44.90695ライン        17     i=1
New var:….i=1
13:03:44.90695ライン        18     while i<len(nums):
13:03:44.90695ライン        19。         if nums[i]==nums[i-1]:
13:03:44.90695ライン        20             flags+=1
Modified var:.flage=1
13:03:44.90695ライン        21             i+=1
Modified var:.i=2
13:03:44.91193ラインナップ        22             if flags>=2:
13:03:44.91193ラインナップ        18     while i<len(nums):
13:03:44.91193ラインナップ        19。         if nums[i]==nums[i-1]:
13:03:44.91193ラインナップ        20             flags+=1
Modified var:.flags=2
13:03:44.91193ラインナップ        21             i+=1
Modified var:.i=3
13:03:44.91193ラインナップ        22             if flags>=2:
13:03:44.91193ラインナップ        23                 del nums[i-1]
Modified var:.nums=[1,1,2]
13:03:44.91193ラインナップ        24。                 i-=1
Modified var:.i=2
13:03:44.91193ラインナップ        18     while i<len(nums):
13:03:44.91193ラインナップ        19。         if nums[i]==nums[i-1]:
13:03:44.91193ラインナップ        26             i+=1
Modified var:.i=3
13:03:44.91693ライン        27。             フラグ=0
Modified var:.flage=0
13:03:44.91693ライン        18     while i<len(nums):
13:03:44.91693ライン        28     return len(nums)
13:03:44.91693リターン      28     return len(nums)
Return value:.3
もちろん、この直接出力内容が嫌なら、ログ記録を保存したいなら、この装飾器はいくつかのオプションパラメータがあります。

@pysnooper.snoop('log/file.log')
まず、ログディレクトリを作成して、ログをファイルに出力します。

@pysnooper.snoop(prefix='removeDuplicates: ')
デバッグされた行にプレフィックス名を付けると、認識と位置付けが簡単になります。このパラメータは複数の関数を同時にデバッグする場合に適用されます。ここでの例は、関数名をプレフィックス名として使用しています。

removeDuplicates: Starting var:.. nums = [1, 1, 1, 2]
removeDuplicates: 13:53:14.322036 call    11 def removeDuplicates(nums):
removeDuplicates: 13:53:14.323037 line    16   flag = 0

@pysnooper.snoop(variables=('foo.bar', 'self.whatever'))
非ローカル変数を表示

@pysnooper.snoop(depth=2)
関数の中で関数のsnoop行を呼び出して、depthパラメーターのが範囲を取るのは1のまっすぐな整数より大きいですかます等しくて、ソースの中でこのように判断があります:astert self.depth>=1を取るならば、1より小さい値を取って投げます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。