zoukankan      html  css  js  c++  java
  • fw: python 调试技巧

    shhgs 发表于 2008-08-30 01:42

    Python调试技巧介绍

    Python调试技巧

    鉴于这个问题已经被问过多次了,我觉得应该写一个文档介绍一下Python的调试。

    1. print
    不要看不起print,这是一切调试的起点,即便是调试Java或者C这种巨麻烦的编译语言,print仍然是常用工具。当然,我们讲的是Python,是比Java和C要方便100倍的动态解释语言,因此这个print就更有力了。至于语法如何,不用我讲了吧。

    2. reload
    python本身就是一个交互式环境,你完全可以一边写代码,一边开一个python进程,然后用reload调用你写的模块,顺手传几个参数进去,看看运行的结果。

    [code]# file name fac.py
    def factorial(n):
            result = 1
            for i in range(1, n+1):
                    result *= i
            return result[/code]

    [code]
    >>> fac.factorial(5)
    120
    [/code]

    然后你用递归重写了factorial(注意,我这里把*替换成了+)

    [code]# file name fac.py
    def factorial(n):
            if n == 1:
                    return result
            else:
                    return n + factorial(n-1)[/code]

    [code]
    >>> reload(fac)
    <module 'fac' from 'fac.py'>
    >>> fac.factorial(5)
    15[/code]

    3. reload有一点限制,就是这个模块得能import得到。如果程序恰好不在PYTHONPATH里面,这一招就玩不转了。不过人不能让尿憋死对不对?所以python提供了exec和eval。

    严格地说exec和eval并不是为了调试设计的,甚至我都不知道它们“应该”用在哪里。通常Perl程序员都喜欢,或者不得不用exec,eval实现一些很暴力,很变态的功能。不过由于Python的良好设计,这种滥用暴力的场合并不常见,因此Python初学者都对exec和eval不甚了解。这里正好借这个机会介绍一下者两个工具。

    exec的语法是
    exec(code, environment)

    这个code可以是一个字符串,也可以是一个文件对象。下面我们用文件对象举例。

    [code]>>> d = {}
    >>> exec(file('/tmp/fac.py', d)
    >>> d.get('factorial')(5)
    15
    [/code]

    eval和exec的意思相近,不过其功能是计算而不是赋值。(接上面的例子)
    [code]>>> eval('factorial(12)', d)
    15[/code]

    这里environment是一个dictonary,因此当python执行完code之后,他会把所有的东西都放在这个environment里面。如果你不指定environment,python会在当前的environment里执行这段代码。如果你刚运行了一个factorial,接着又执行了这个fac.py,那么这段代码里的factorial就会取代你刚运行的factorial。因此,强烈建议你,总是指定一个environment


    4. python -i
    exec也好,reload也罢,对于调试单独一个类或者方法,是很方便的,但是如果在写要用到这些类或者方法的程序时,该怎么调试呢?写一个wrapper方法。好主意,实际上我自己就经常这么做。不过python的命令行参数提供了一个更棒的方法, -i

    [code]# test.py
    def factorial(n):
        if n == 1:
            return 1
        else:
            return n * factorial(n-1)

    def sum(n):
        if n == 1:
            return 1
        else:
            return n + sum(n-1)

    result = 0
    for i in range(5, 7):
        result += factorial(i) + sum(i)

        if i == 6 :     # our debugging break point
            break       #
    [/code]


    [code]python -i test.py
    >>>
    >>> dir()
    ['__builtins__', '__doc__', '__file__', '__name__', 'factorial', 'i', 'result', 'sum']
    >>> result
    876[/code]

    5. logging
    logging是一个远比print更强大的调试工具。Python的logging模块非常强大,任何一个严肃的Py开发人员都应该学会使用这个模块。建议大家从Python的文档入手,学习这个模块。这里我就不多讲了。

    6. pdb, idle,komodo,windpdb,以及其他调试工具。
    很遗憾,除了idle和komodo用过几次,其他的都是只闻其名,实在是不知道该怎么介绍。不过我倒是一点也不觉得遗憾。就我个人的感觉,有了上面5个工具,完全够用了。


  • 相关阅读:
    解决Android Studio Gradle DSL method not found: 'android()'
    【转】关于ListView中notifyDataSetChanged()刷新数据不更新原因
    设计模式-单例模式
    IE浏览器让DIV居中
    Java通过DOM解析XML
    git 配置文件位置;git配置文件设置
    git config配置
    dos2unix
    文件的编码问题解决
    git diff old mode 100644 new mode 100755
  • 原文地址:https://www.cnblogs.com/dracula/p/2000705.html
Copyright © 2011-2022 走看看