PySnooper에서 print를 사용하여 디버깅을 영원히 하지 말라는 문제

PySnooper는 매우 편리한 디버거입니다.Python 코드가 예상대로 작동하지 않는 이유를 확인하려면, 인터럽트와 감시 기능이 있는 성숙한 Debug 도구를 사용하고 싶지만, 많은 Debug 도구를 설정하는 것은 매우 번거롭습니다.
이제 Pysnooper가 생겼습니다. 그렇게 복잡한 Debug 도구를 설정하지 않아도 전체 코드에 대한 분석을 완성할 수 있습니다.그것은 어떤 코드가 실행 중인지, 그리고 국부 변수의 값이 무엇인지 알려줄 수 있습니다.
사실, Pysnooper는 한 줄 한 줄 print의 반복적인 작업을 대체하고 코드에 pysnooper 장식기를 줍니다. 문장과 변수를 자동으로 식별하고 그 값을 print할 수 있습니다.

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)
효과는 다음과 같습니다.

Source path:... 1.py
Starting var:.. number = 6
23:03:35.990701 call     4 def number_to_bits(number):
23:03:35.991699 line 5   if number:
23:03:35.991699 line 6     bits = []
New var:....... bits = []
23:03:35.991699 line 7     while number:
23:03:35.991699 line 8       number, remainder = divmod(number, 2)
Modified var:.. number = 3
New var:....... remainder = 0
23:03:35.991699 line 9       bits.insert(0, remainder)
Modified var:.. bits = [0]
23:03:36.004664 line 7     while number:
23:03:36.005661 line 8       number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
23:03:36.005661 line 9       bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
23:03:36.007657 line 7     while number:
23:03:36.007657 line 8       number, remainder = divmod(number, 2)
Modified var:.. number = 0
23:03:36.008655 line 9       bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
23:03:36.008655 line 7     while number:
23:03:36.009651 line 10     return bits
23:03:36.009651 return   10     return bits
Return value:.. [1, 1, 0]
Elapsed time: 00:00:00.020945
모든 줄 변수의 값을 화면에 출력해서 코드를 디버깅할 수 있습니다.
코드 한 줄만 쓰면 장식기를 사용하면 이 편리한 디버깅 기능을 실현할 수 있으며, 한 줄로 print를 쓰는 것보다 훨씬 편리하다.
0. 설치 모듈
이 모듈을 사용하면 Pip을 사용하여 PySnooper를 설치하면 됩니다.

pip install pysnooper
다음은 이 모듈의 다른 유용한 기능에 대해 설명합니다.
1. 로그 파일 지원
만약 print를 화면에 출력하는 것이 불편하다면, 로그 파일에 출력할 수 있습니다. 장식기 줄을 다음과 같이 바꾸기만 하면 됩니다.

@pysnooper.snoop('/my/log/file.log')
2. 외부 변수 또는 다른 표현식 읽기
장식기의 작용 범위 이외의 변수나 표현식 값을 읽으려면watch 매개 변수를 사용할 수 있습니다.

@pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]'))
3. 장식기를 사용하지 않으려면 상하문 형식으로 디버깅할 수도 있다
맞아요. 장식기는 한정된 사용 조건이 있어서 사용하기에 한계가 있기 때문에pysnooper는 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
우리가 일부 코드만 디버깅할 때, 이 상하문 형식의 디버깅 방법은 매우 편리하다.
그 밖에 Pysnooper는 더욱 강력한 사용법을 가지고 있습니다. 여러분은 그들의 고급 사용 문서를 볼 수 있습니다.
https://github.com/cool-RR/PySnooper/blob/master/ADVANCED_USAGE.md
PySnooper에서 영원히 print로 디버깅하지 말라는 글을 소개합니다. 더 많은 Pysnooper print 디버깅 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 찾아보세요. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기