当前位置: 首页 > 科技观察

使用这个开源工具在Python中观察变量

时间:2023-03-20 18:23:28 科技观察

Watchpoints是一个简单但功能强大的工具,可帮助您在调试Python时观察变量。调试代码时,您经常面临弄清楚变量何时更改的问题。如果您没有任何高级工具,那么您可以选择使用print语句在您期望变量发生变化时输出变量。然而,这是一种非常低效的方法,因为变量可能会在很多地方发生变化,并且不断地将其打印到终端是非常具有侵入性的,并且将它们打印到日志文件变得很麻烦。这是一个常见问题,但现在有一个简单而强大的工具可以帮助您监控变量:观察点。“观察点”的概念在C和C++调试器中很常见,用于监视内存,但在Python中缺少相应的工具。观察点填补了这一空白。要使用它,您必须先使用pip安装它:$python3-mpipinstallwatchpoints在Python中使用观察点对于您要监视的任何变量,请使用watch函数对其进行监视。fromwatchpointsimportwatcha=0watch(a)a=1当变量改变时,它的值将被打印到标准输出:======WatchpointsTriggered======CallStack(mostrecentcalllast):(my_script.py:5):>a=1a:0->1信息包括:变量改变的行。调用堆栈。变量的先前/当前值。它不仅适用于变量本身,也适用于对对象的更改:fromwatchpointsimportwatcha=[]watch(a)a={}#triggera["a"]=2#当变量a被重新赋值时触发回调将被触发,并且当分配给a的对象发生变化时也会被触发。更有趣的是,监控不受范围限制。您可以从任何地方观察变量/对象,无论程序正在执行什么功能,都会触发回调。fromwatchpointsimportwatchdeffunc(var):var["a"]=1a={}watch(a)func(a)例如,这段代码打印:======WatchpointsTriggered======Call堆栈(最近调用最后):(my_script.py:8):>func(a)func(my_script.py:4):>var["a"]=1a:{}->{'a':1}watch函数不仅可以监控一个变量,还可以监控一个字典或列表的属性和元素。fromwatchpointsimportwatchclassMyObj:def__init__(self):self.a=0obj=MyObj()d={"a":0}watch(obj.a,d["a"])#是的,你可以这样做doobj.a=1#triggerd["a"]=1#trigger这可以帮助你缩小到一些你感兴趣的特定对象。如果你对输出格式不满意,你可以自定义它。定义自己的回调函数即可:watch(a,callback=my_callback)#或者在触发时全局设置watch.config(callback=my_callback),甚至可以使用pdb:watch.config(pdb=True)这个和断点一样()的行为类似,会给你类似调试器的体验。如果不想在每个文件都导入这个函数,可以通过install函数使其全局化:watch.install()#或者watch.install("func_name"),然后个人认为使用func_name(),观察点最酷的地方在于它们使用起来很直观。你对一些数据感兴趣吗?只需“观察”它,您就会知道您的变量何时发生变化。试用观察点我在GitHub上开发和维护观察点,并在Apache2.0许可下发布。安装和使用它,当然欢迎贡献。