「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 在输出时)