安装
要使用它,你必须先用 pip
安装它:
-
$ python3 -m pip install watchpoints
在Python中使用 watchpoints
对于任何一个你想监控的变量,使用 watch
函数对其进行监控。
-
from watchpoints import watch
-
a = 0
-
watch(a)
-
a = 1
当变量发生变化时,它的值就会被打印到标准输出:
-
====== Watchpoints Triggered ======
-
Call Stack (most recent call last):
-
<module> (my_script.py:5):
-
> a = 1
-
a:
-
0
-
->
-
1
信息包括:
- 变量被改变的行。
- 调用栈。
- 变量的先前值/当前值。
它不仅适用于变量本身,也适用于对象的变化:
-
from watchpoints import watch
-
a = []
-
watch(a)
-
a = {} # 触发
-
a["a"] = 2 # 触发
当变量 a
被重新分配时,回调会被触发,同时当分配给 a
的对象发生变化时也会被触发。
更有趣的是,监控不受作用域的限制。你可以在任何地方观察变量/对象,而且无论程序在执行什么函数,回调都会被触发。
-
from watchpoints import watch
-
def func(var):
-
var["a"] = 1
-
a = {}
-
watch(a)
-
func(a)
例如,这段代码打印出:
-
====== Watchpoints Triggered ======
-
Call Stack (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 import watch
-
class MyObj:
-
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
函数使其成为全局:
-
watch.install() # 或 watch.install("func_name") ,然后以 func_name() 方式使用
我个人认为,watchpoints
最酷的地方就是使用直观。你对一些数据感兴趣吗?只要“观察”它,你就会知道你的变量何时发生变化。