副标题#e#
要使用它,你必须先用 pip 安装它:
$ python3 -m pip install watchpoints
在Python中使用 watchpoints
对于任何一个你想监控的变量,使用 watch 函数对其进行监控。
from watchpoints importwatch
a =0
watch(a)
a =1
当变量发生变化时,它的值就会被打印到标准输出:
======WatchpointsTriggered======
CallStack(most recent call last):
<module>(my_script.py:5):
> a =1
a:
0
->
1
信息包括:
变量被改变的行。
调用栈。
变量的先前值/当前值。
它不仅适用于变量本身,也适用于对象的变化:
from watchpoints importwatch
a =[]
watch(a)
a ={}#触发
a["a"]=2#触发
当变量 a 被重新分配时,回调会被触发,同时当分配给 a 的对象发生变化时也会被触发。
更有趣的是,监控不受作用域的限制。你可以在任何地方观察变量/对象,而且无论程序在执行什么函数,回调都会被触发。
from watchpoints importwatch
def func(var):
var["a"]=1
a ={}
watch(a)
func(a)
例如,这段代码打印出:
======WatchpointsTriggered======
CallStack(most recent call last):
<module>(my_script.py:8):
> func(a)
func (my_script.py:4):
>var["a"]=1
a:
{}
->
{'a':1}
watch 函数不仅可以监视一个变量,它也可以监视一个字典或列表的属性和元素。
from watchpoints importwatch
classMyObj:
def __init__(self):
self.a =0
obj =MyObj()
d ={"a":0}
watch(obj.a, d["a"])#是的,你可以这样做
obj.a =1#触发
d["a"]=1#触发
这可以帮助你缩小到一些你感兴趣的特定对象。
如果你对输出格式不满意,你可以自定义它。只需定义你自己的回调函数:
watch(a, callback=my_callback)
#或者全局设置
watch.config(callback=my_callback)
当触发时,你甚至可以使用 pdb:
watch.config(pdb=True)
这与 breakpoint() 的行为类似,会给你带来类似调试器的体验。
如果你不想在每个文件中都导入这个函数,你可以通过 install 函数使其成为全局:
#p#副标题#e#
watch.install()#或watch.install("func_name"),然后以 func_name()方式使用
我个人认为,watchpoints 最酷的地方就是使用直观。你对一些数据感兴趣吗?只要“观察”它,你就会知道你的变量何时发生变化。