操纵这个开源工具来看管 Python 中的变量

安装

要使用它,你必须先用 pip 安装它:


  1. $ python3 -m pip install watchpoints

在Python中使用 watchpoints

对于任何一个你想监控的变量,使用 watch 函数对其进行监控。


  1. from watchpoints import watch
  2.  
  3. a = 0
  4. watch(a)
  5. a = 1

当变量发生变化时,它的值就会被打印到标准输出


  1. ====== Watchpoints Triggered ======
  2.  
  3. Call Stack (most recent call last):
  4. <module> (my_script.py:5):
  5. > a = 1
  6. a:
  7. 0
  8. ->
  9. 1

信息包括:

  • 变量被改变的行。
  • 调用栈。
  • 变量的先前值/当前值。

它不仅适用于变量本身,也适用于对象的变化:


  1. from watchpoints import watch
  2.  
  3. a = []
  4. watch(a)
  5. a = {} # 触发
  6. a["a"] = 2 # 触发

当变量 a 被重新分配时,回调会被触发,同时当分配给 a 的对象发生变化时也会被触发。

更有趣的是,监控不受作用域的限制。你可以在任何地方观察变量/对象,而且无论程序在执行什么函数,回调都会被触发。


  1. from watchpoints import watch
  2.  
  3. def func(var):
  4.     var["a"] = 1
  5.  
  6. a = {}
  7. watch(a)
  8. func(a)

例如,这段代码打印出:


  1. ====== Watchpoints Triggered ======
  2.  
  3. Call Stack (most recent call last):
  4.  
  5. <module> (my_script.py:8):
  6. > func(a)
  7. func (my_script.py:4):
  8. > var["a"] = 1
  9. a:
  10. {}
  11. ->
  12. {'a': 1}

watch 函数不仅可以监视一个变量,它也可以监视一个字典或列表的属性和元素。


  1. from watchpoints import watch
  2.  
  3. class MyObj:
  4.     def __init__(self):
  5.         self.a = 0
  6.  
  7. obj = MyObj()
  8. d = {"a": 0}
  9. watch(obj.a, d["a"]) # 是的,你可以这样做
  10. obj.a = 1 # 触发
  11. d["a"] = 1 # 触发

这可以帮助你缩小到一些你感兴趣的特定对象。

如果你对输出格式不满意,你可以自定义它。只需定义你自己的回调函数:


  1. watch(a, callback=my_callback)
  2.  
  3. # 或者全局设置
  4.  
  5. watch.config(callback=my_callback)

当触发时,你甚至可以使用 pdb


  1. watch.config(pdb=True)

这与 breakpoint() 的行为类似,会给你带来类似调试器的体验。

如果你不想在每个文件中都导入这个函数,你可以通过 install 函数使其成为全局:


  1. watch.install() # watch.install("func_name") ,然后以 func_name() 方式使用

我个人认为,watchpoints 最酷的地方就是使用直观。你对一些数据感兴趣吗?只要“观察”它,你就会知道你的变量何时发生变化。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章