Python 中取代 Printf 大法的工具
「printf 大法」大概是最早期学到的 debug 方式?不同语言有不同的指令,在 Python 里对应的是 print指令 (加上%或是.format)。
刚刚看到「 cool-RR/pysnooper 」这个 Python 上的工具,只要增加 @pysnooper.snoop这组 decorator,就可以自动帮你把变量的值打印出來。网站上的范例是这样,可以看到就只是加了一行 decorator:
-
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 就有满满的资讯可以看:
-
Starting var:.. number = 6 -
21:14:32.099769 call 3 @pysnooper.snoop -
21:14:32.099769 line 5 if number: -
21:14:32.099769 line 6 bits = -
New var:....... bits = -
21:14:32.099769 line 7 while number: -
21:14:32.099769 line 8 number, remainder = divmod(number, 2) -
New var:....... remainder = 0 -
Modified var:.. number = 3 -
21:14:32.099769 line 9 bits.insert(0, remainder) -
Modified var:.. bits = [0] -
21:14:32.099769 line 7 while number: -
21:14:32.099769 line 8 number, remainder = divmod(number, 2) -
Modified var:.. number = 1 -
Modified var:.. remainder = 1 -
21:14:32.099769 line 9 bits.insert(0, remainder) -
Modified var:.. bits = [1, 0] -
21:14:32.099769 line 7 while number: -
21:14:32.099769 line 8 number, remainder = divmod(number, 2) -
Modified var:.. number = 0 -
21:14:32.099769 line 9 bits.insert(0, remainder) -
Modified var:.. bits = [1, 1, 0] -
21:14:32.099769 line 7 while number: -
21:14:32.099769 line 10 return bits -
21:14:32.099769 return 10 return bits
另外还可以写到档案里里,可以指定允许的深度,或是直接指定要打印哪些变量。另外输出时,也可以指定 prefix 避免混淆(通常会用在 stderr,也只有 pysnooper 在输出时)
浙公网安备 33010602011771号