社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 中取代 Printf 大法的工具

编程派 • 6 年前 • 636 次点击  

「printf 大法」大概是最早期学到的 debug 方式?不同语言有不同的指令,在 Python 里对应的是 print 指令 (加上 % 或是 .format() )。

刚刚看到「 cool-RR/pysnooper 」这个 Python 上的工具,只要增加 @pysnooper.snoop() 这组 decorator,就可以自动帮你把变量的值打印出來。网站上的范例是这样,可以看到就只是加了一行 decorator:

  1. import pysnooper


  2. @pysnooper.snoop()

  3. def number_to_bits(number):

  4. if number:

  5. bits = []

  6. while number:

  7. number, remainder = divmod(number, 2)

  8. bits.insert(0, remainder)

  9. return bits

  10. else:

  11. return [0]


  12. number_to_bits(6)

然后对应的 stderr 就有满满的资讯可以看:

  1. Starting var:.. number = 6

  2. 21:14:32.099769 call 3 @pysnooper.snoop()

  3. 21:14:32.099769 line 5 if number:

  4. 21:14:32.099769 line 6 bits = []

  5. New var:....... bits = []

  6. 21:14:32.099769 line 7 while number:

  7. 21:14:32.099769 line 8 number, remainder = divmod(number, 2)

  8. New var:....... remainder = 0

  9. Modified var:.. number = 3

  10. 21:14:32.099769 line 9 bits.insert(0, remainder)

  11. Modified var:.. bits = [0]

  12. 21:14:32.099769 line 7 while number:

  13. 21:14:32.099769 line 8 number, remainder = divmod(number, 2)

  14. Modified var:.. number = 1

  15. Modified var:.. remainder = 1

  16. 21:14:32.099769 line 9 bits.insert(0, remainder)

  17. Modified var:.. bits = [1, 0]

  18. 21:14:32.099769 line 7 while number:

  19. 21:14:32.099769 line 8 number, remainder = divmod(number, 2)

  20. Modified var:.. number = 0

  21. 21:14:32.099769 line 9 bits.insert(0, remainder)

  22. Modified var:.. bits = [1, 1, 0]

  23. 21:14:32.099769 line 7 while number:

  24. 21:14:32.099769 line 10 return bits

  25. 21:14:32.099769 return 10 return bits

另外还可以写到档案里里,可以指定允许的深度,或是直接指定要打印哪些变量。另外输出时,也可以指定 prefix 避免混淆(通常会用在 stderr,也只有 pysnooper 在输出时)

原文链接:https://blog.gslin.org/archives/2019/04/24/8951/

回复下方「关键词」,获取优质资源


回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「pybooks02」,立即获取 O'Reilly 出版社推出的免费 Python 相关电子书合集

回复关键词「书单02」,立即获取主页君整理的 10 本 Python 入门书的电子版



印度小伙写了套深度学习教程,Github上星标已经5000+

上百个数据文件合并,只能手动复制粘贴?教你一招十秒搞定!

一个提升图像识别准确率的精妙技巧

一文读懂:从 Python 打包到 CLI 工具

如何使用 Python 进行时间序列预测?

美亚Kindle排名第一的Python 3入门书,火遍了整个编程圈

十分钟搭建私有 Jupyter Notebook 服务器

使用 Python 制作属于自己的 PDF 电子书

12步轻松搞定Python装饰器

200 行代码实现 2048 游戏

题图:pexels,CC0 授权。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32093
 
636 次点击