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,以及其他调试工具。


相关文章
|
8月前
|
安全 程序员 Python
Python中的异常处理与错误调试
【4月更文挑战第8天】本文探讨Python中的异常处理和错误调试,将其比喻为驾驶过程中的意外情况。异常是程序执行时的非正常事件,如文件缺失或网络故障,而错误是代码本身的逻辑或语法问题。Python通过try-except语句处理异常,确保程序在遇到问题时不会立即崩溃。错误调试则需定位问题根源,利用pdb等工具逐行检查代码。这两个技能对保持代码稳定性和可靠性至关重要,能增强程序应对意外的能力并帮助修复潜在问题。
54 1
|
8月前
|
开发框架 人工智能 Rust
Python 潮流周刊#12:Python 中如何调试死锁问题?
Python 潮流周刊#12:Python 中如何调试死锁问题?
58 0
|
2月前
|
存储 JSON 监控
告别Print,使用IceCream进行高效的Python调试
本文将介绍**IceCream**库,这个专门用于调试的工具显著提升了调试效率,使整个过程更加系统化和规范化。
80 2
告别Print,使用IceCream进行高效的Python调试
|
4月前
|
监控 Python Windows
python知识点100篇系列-pysnooper用于调试
PySnooper是一个便捷的Python调试工具,用于监控代码执行过程及局部变量的变化,替代繁琐的打印语句。作为GitHub上的热门开源项目,它通过装饰器自动记录代码执行细节。安装简便,支持多种平台,可通过pip安装。使用时,只需在目标函数上添加装饰器即可实时查看变量变化或将其记录至日志文件。此外,还支持使用with块对特定代码段进行调试。更多详细信息可参阅其官方使用文档。
python知识点100篇系列-pysnooper用于调试
|
5月前
|
JavaScript 前端开发 ice
简单实用,Python代码调试利器~
简单实用,Python代码调试利器~
59 4
简单实用,Python代码调试利器~
使用icecream优雅调试Python代码
在大型项目中,使用print()调试代码可能导致终端输出过多,难以分辨输出结果与代码的对应关系。为了更清晰地调试,可以采用Icecream库。通过使用Icecream,可以更有效地进行Python代码调试,同时保持代码的整洁性。
|
5月前
|
程序员 开发工具 Python
[oeasy]python0030_动态控制断点_breakpoints_debug_调试
[oeasy]python0030_动态控制断点_breakpoints_debug_调试
43 2
|
5月前
|
搜索推荐 JavaScript 前端开发
简单实用,Python代码调试利器/java代码的设计和解读
尽管有许多高级调试工具,但在多数情况下,`print()`仍是便捷之选。`icecream`库则将`print()`调试法发挥到极致,简化变量检查与信息输出,提升调试效率。无论是基本变量还是复杂数据结构,`icecream`都能轻松应对,并支持自定义输出格式,让你的调试工作更高效。下面,让我们一起探索`icecream`的更多实用功能吧!
26 0
|
5月前
|
搜索推荐 JavaScript 前端开发
简单实用,Python代码调试利器
简单实用,Python代码调试利器
48 0
|
5月前
|
监控 Java Serverless
Serverless 应用的监控与调试问题之PyFlink对于Python UDF的性能如何提升
Serverless 应用的监控与调试问题之PyFlink对于Python UDF的性能如何提升