安裝
安裝方法很簡單,可以使用 pip 或 anaconda 兩種安裝方法:
$ pip install pysnooper
或者
$ conda install -c conda-forge pysnooper
監控整個函數
一個使用例子如下,首先是需要導入 pysnooper ,然後想知道函數 number_to_bits() 的運行情況,只需要添加 @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)
輸出結果
Starting var:.. number = 6
14:52:10.169804 call 4 def number_to_bits(number):
14:52:10.169899 line 5 if number:
14:52:10.169923 line 6 bits = []
New var:....... bits = []
14:52:10.169940 line 7 while number:
14:52:10.169963 line 8 number, remainder = divmod(number, 2)
Modified var:.. number = 3
New var:....... remainder = 0
14:52:10.169981 line 9 bits.insert(0, remainder)
Modified var:.. bits = [0]
14:52:10.170006 line 7 while number:
14:52:10.170028 line 8 number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
14:52:10.170045 line 9 bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
14:52:10.170068 line 7 while number:
14:52:10.170088 line 8 number, remainder = divmod(number, 2)
Modified var:.. number = 0
14:52:10.170104 line 9 bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
14:52:10.170124 line 7 while number:
14:52:10.170143 line 10 return bits
14:52:10.170159 return 10 return bits
Return value:.. [1, 1, 0]
監控函數一部分
通過使用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:....... lst = [166, 196, 138, 683, 176, 265, 838, 597, 105, 407]
New var:....... i = 9
14:55:33.853343 line 10 lower = min(lst)
New var:....... lower = 105
14:55:33.853460 line 11 upper = max(lst)
New var:....... upper = 838
105 471.5 838
14:55:33.853492 line 12 mid = (lower + upper) / 2
New var:....... mid = 471.5
14:55:33.853520 line 13 print(lower, mid, upper)
其他使用技巧
重定向到文件, 在文件中查看
@pysnooper.snoop('/my/log/file.log')
監控函數外變量
@pysnooper.snoop(watch=('number','number1'))
def number_to_bits():
global number
if number:
查看list或者dict等引用的每個元素的值的變化(默認只顯示整個對象的變化,不會針對每個元素的變化提示)
@pysnooper.snoop(watch_explode=('bits','bits1'))
跟蹤的函數深度,默認爲1,只跟蹤當前函數的變量的變化
@pysnooper.snoop(depth=2)
在跟蹤日誌前面加前綴, 方便跟自己的日誌進行區分
@pysnooper.snoop(prefix='ZZZ ')