• 很多同学在学习时,为了实时监测代码运行的过程以便更好的debug,通常会用到断点调试、IDE自带debug工具等。断点等调试方法虽然强大,但是设置比较麻烦。为此print成了很多人的最爱。
  • 其实,我们用的最多的是,在重要计算、变量改变等地方加一个print,俗称打印(输出到屏幕),把我们需要监测的东西显示出来。嘿嘿,就是你,你就是这么做的;好吧,我承认,我也这么干!
  • 写完程序,我还要一行一行的吧这些print删除或者注释掉,说多了都是泪。。。

2019年新神器继位!-》pysnooper

  • 记得我给我组学员的每次视频考核,都会提到:python的强大,在它的开源,有众多的第三方包开发者和维护者,你想做什么基本都有对应的第三方包
  • PySnooper让你做print的事情,但不需要麻烦地添加很多语句,你只需要添加装饰器就可以得到运行日志,包括线运行,及对应变量的值。

实例

  • 代码
  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)
  • 执行
Starting var:.. number = 6
21:14:32.099769 call              3 @pysnooper.snoop()
21:14:32.099769 line                     5             if number:
21:14:32.099769 line                     6                     bits = []
New var:....... bits = []
21:14:32.099769 line                     7                     while number:
21:14:32.099769 line                     8                             number, remainder = divmod(number, 2)
New var:....... remainder = 0
Modified var:.. number = 3
21:14:32.099769 line                     9                             bits.insert(0, remainder)
Modified var:.. bits = [0]
21:14:32.099769 line                     7                         while number:
21:14:32.099769 line                     8                                 number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
21:14:32.099769 line                     9                                 bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
21:14:32.099769 line                     7                         while number:
21:14:32.099769 line                     8                                 number, remainder = divmod(number, 2)
Modified var:.. number = 0
21:14:32.099769 line                     9                                 bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
21:14:32.099769 line                     7                         while number:
21:14:32.099769 line                    10                return bits
21:14:32.099769 return      10                         return bits

  • 从上面执行结果可以看出,Pysnooper将运行过程标准化的输出到屏幕,每个执行时间点变量发生了什么改变,对应哪个语句,何时被return,清晰明白。
  • 你说上面输出内容的看不懂?(麻烦您好好看,思考一下)

特征和其他用法

  • Pysnooper是以标准错误的方式输出(stderr),如果您不方便访问stderr,则可以重定向到文件:
  • @pysnooper.snoop('/my/log/file.log')
  • 查看非局部变量的值:
  • @pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]'))
  • 展开值以查看其所有属性或列表/字典项:
  • @pysnooper.snoop(watch_explode=('foo', 'self'))
  • 显示函数调用的snoop行:
  • @pysnooper.snoop(depth=2)
  • 窥探指定前缀的行:
  • @pysnooper.snoop(prefix ='ZZZ')

高级用法

  • watch_explode将根据其类自动猜测如何扩展传递给它的表达式。
  • 具体使用如下:
import pysnooper


@pysnooper.snoop(watch=(
    pysnooper.Attrs('x'),    # attributes
    pysnooper.Keys('y'),     # mapping (e.g. dict) items
    pysnooper.Indices('z'),  # sequence (e.g. list/tuple) items
))
  • 你可以使用使用exclude参数排除特定键/属性/索引,例如:Attrs('x', exclude=('_foo', '_bar')).
  • 在“索引”后添加切片,仅查看该切片中的值,例如:Indices('z')[-3:]

安装和使用

  • 就不告诉你!
  • 安装第三方包你都不会咩?

就是这个pysnooper,一个马上过万star的github项目,https://github.com/cool-RR/PySnooper/