PySnooper는 가난한 사람을 위한 디버거입니다. Bash를 사용했다면 더 멋진 점을 제외하면 Python의 set -x
와 같습니다.
귀하의 이야기: 귀하는 Python 코드가 해야 한다고 생각하는 작업을 수행하지 않는 이유를 알아내려고 노력하고 있습니다. 중단점과 조사식을 갖춘 완전한 기능을 갖춘 디버거를 사용하고 싶지만 지금 당장 설정할 수는 없습니다.
어떤 라인이 실행되고 어떤 라인이 실행되지 않고 지역 변수의 값이 무엇인지 알고 싶습니다.
대부분의 사람들은 전략적 위치에서 print
라인을 사용하며 그 중 일부는 변수 값을 표시합니다.
PySnooper를 사용하면 올바른 print
라인을 신중하게 만드는 대신 관심 있는 함수에 데코레이터 라인 하나만 추가한다는 점을 제외하면 동일한 작업을 수행할 수 있습니다. 어떤 라인을 포함하여 함수에 대한 실황 로그를 얻을 수 있습니다. 언제, 실행되었는지, 그리고 정확히 언제 지역 변수가 변경되었는지.
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 )
stderr에 대한 출력은 다음과 같습니다.
또는 전체 함수를 추적하고 싶지 않은 경우 관련 부분을 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-forge 채널이 있는 Conda:
$ conda install -c conda-forge pysnooper
아치 리눅스:
$ yay -S python-pysnooper
페도라 리눅스:
$ 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 라이센스에 따라 공개됨.
Hacker News 스레드 및 /r/Python Reddit 스레드(2019년 4월 22일)