调试

作者: 噜噜迅儿 | 来源:发表于2018-05-24 23:27 被阅读0次

    print

    第一种方法简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看。

    断言

    凡是用print()来辅助查看的地方,都可以用断言(assert)来替代:

    def foo(s):
        n = int(s)
        assert n != 0, 'n is zero!'
        return 10 / n
    
    def main():
        foo('0')
    
    ## 如果断言失败,assert语句本身就会抛出AssertionError:
    $ python err.py
    Traceback (most recent call last):
      ...
    AssertionError: n is zero!
    
    ## 启动Python解释器时可以用-O参数来关闭assert,关闭后,你可以把所有的assert语句当成pass来看。
    $ python -O err.py
    Traceback (most recent call last):
      ...
    ZeroDivisionError: division by zero
    
    

    logging

    把print()替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:

    import logging
    logging.basicConfig(level=logging.INFO)
    
    s = '0'
    n = int(s)
    logging.info('n = %d' % n)
    print(10 / n)
    
    ## 测试
    $ python err.py
    INFO:root:n = 0
    Traceback (most recent call last):
      File "err.py", line 8, in <module>
        print(10 / n)
    ZeroDivisionError: division by zero
    

    这就是logging的好处,它允许你指定记录信息的级别,有debuginfowarningerror等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debuginfo就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

    logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

    pdb

    第4种方式是启动Python的调试器pdb

    $ python -m pdb err.py
    > /Users/michael/Github/learn-python3/samples/debug/err.py(2)<module>()
    -> s = '0'
    
    ## 输入命令l来查看代码:
    (Pdb) l
      1     # err.py
      2  -> s = '0'
      3     n = int(s)
      4     print(10 / n)
    
    ## 输入命令n可以单步执行代码:
    (Pdb) n
    > /Users/michael/Github/learn-python3/samples/debug/err.py(3)<module>()
    -> n = int(s)
    (Pdb) n
    > /Users/michael/Github/learn-python3/samples/debug/err.py(4)<module>()
    -> print(10 / n)
    
    ## 任何时候都可以输入命令p 变量名来查看变量:
    (Pdb) p s
    '0'
    (Pdb) p n
    0
    
    ## 输入命令q结束调试,退出程序:
    (Pdb) q
    

    pdb.set_trace()

    ## import pdb,然后,在可能出错的地方放一个pdb.set_trace()
    # err.py
    import pdb
    
    s = '0'
    n = int(s)
    pdb.set_trace() # 运行到这里会自动暂停
    print(10 / n)
    
    ## 运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行:
    $ python err.py 
    > /Users/michael/Github/learn-python3/samples/debug/err.py(7)<module>()
    -> print(10 / n)
    (Pdb) p n
    0
    (Pdb) c
    Traceback (most recent call last):
      File "err.py", line 7, in <module>
        print(10 / n)
    ZeroDivisionError: division by zero
    

    IDE

    Visual Studio Code:https://code.visualstudio.com/,需要安装Python插件。

    PyCharm:http://www.jetbrains.com/pycharm/

    相关文章

      网友评论

          本文标题:调试

          本文链接:https://www.haomeiwen.com/subject/zmvejftx.html