你真的会调试你的python程序吗?

简介: 你真的会调试你的python程序吗?

1.什么是assert?


相信很多小伙伴在平时写代码时,肯定多少会看到断言assert语句的存在。但是,日常coding过程中,小伙伴们最常用的调试方法就是print大法啦。虽然我们在学习编程语言时,会学习到assert语法。但是,实际写代码时经常忘记使用这个“不起眼”的小方法,从而导致代码写得不够健壮。事实上,如果我们能在业务代码中将这个“不起眼”的小方法用好,也会便于我们调试代码。



上面啰啰嗦嗦说了一大堆,也没说清楚啥是assert?其实,assert语句是调试python程序的好工具,它主要用来测试一个条件是否满足。如果测试条件成立,则啥也不做;如果测试条件不成立,则会抛出AssertionError异常,并返回具体的错误信息。其他程序语言中也会有类似的断言语句,感兴趣的小伙伴可以自行百度一下。下面以一个简单的程序来演示assert语句是如何使用的:


assert 1 == 2


上面一行简单的代码,它相当于下面三行代码:


if __debug__:
    if not expression:
        raise AssertionError


再来看看assert expression1, expression2的形式是如何使用的,如下例所示:


assert 1 == 2, 'assert is wrong'


上面一行简单的代码,它相当于下面三行代码:


if __debug__:
    if not expression1:
        raise AssertionError(expression2)


上面两个简单的示例代码中,__debug__是一个常数,如果python程序执行时附带了-O选项,那么python程序中所有的assert语句都会失效,即__debug__的值为False;反之,__debug__则为True。

78.png


值得注意的是:如果直接对__debug__进行赋值是非法的,因为它的值在解释器开始运行时就已经决定了,程序运行过程中无法改变。此外,不要在使用assert语句时加入括号,不要加括号!!不要加括号!!!


77.png


2.assert的用法


通过上面一节的学习,相信小伙伴们已经对assert的基本语法有了基本了解。接下来通过一个实际应用的例子,具体看看assert语句在python中的用法,并弄清楚assert的使用场景。


假设一个电商平台正在进行打折促销活动,所以后端需要写一个apply_discount()函数,要求输入原来的价格和折扣,输出结果是打折后价格。因此,我们大致可以写出如下代码:


def apply_discount(price, discount):
    updated_price = price * (1 - discount)
    assert 0 <= updated_price <= price, "price should be greater or equal to 0 and less or equal to original price"
    return updated_price


在上面的apply_discount()函数中,我们加入了一个assert语句,用来检测打折后商品的价格。打折后的价格应该大于等于0、小于等于原价,否则程序就抛出异常。下面测试一下上面写的函数,测试结果如下所示:


76.png


当discount是0.2时,输出80,一切正常。但是,当discount是2时,程序将会抛出异常。因此,如果我们修改相关代码或者加入新功能导致discount值异常时,测试时就会很容易定位问题。assert的加入,可以有效预防bug的发生,提高代码的健壮性。在实际开发中,assert还有一些很常见的用法,如下面的场景:


def func(input):
    assert isinstance(input, list), "input must be type of list"
    if len(input) == 1:
        # ...
    elif len(input) == 2:
        # ...
    else:
        # ...


函数func()中的所有操作都是基于输入参数必须是列表类型这个前提,此时就很有必要在开头加一句assert的检查,防止程序出错。


3.assert错误示例


经过前面的一波安利后,相信很多小伙伴都想在代码中尝试一下了。温馨提示:assert虽然很多地方都可以使用,但是也要注意使用场合。下面以一个场景举例:小王开了一家淘宝店,由于最近上新了一些新品。因此,需要删除一些上线时间较长的商品。于是,作为一名码农的CurryCoder便写出如下删除商品的函数:


def delete_item(user, item_id):
    assert user_is_xiaowang(user), "user must be xiaowang"
    assert item_exist(item_id), "item id must exist"
    delete(item_id)


客户小王要求:只有小王自己才有删除商品的资格,而且这个商品必须存在。


CurryCoder刚接到这个需求时,简单分析了一下需求就写出了上面的函数。但是,仔细分析后我们会发现上面的代码从功能上来说是对的,但是需要注意assert的检查是可以关闭的。当运行python程序,加入-O选项时就会让assert语句失效。因此,一旦assert的检查被关闭,user_is_xiaowang()和item_exist()这两个函数就不会执行。结果就会导致任何人都可以来删除商品,而且不管商品是否存在都可以被强制执行。所以,正确的做法是使用条件语句进行相应的检查,并抛出合理的异常。


def delete_item(user, item_id):
    if not user_is_xiaowang(user):
        raise Exception("user must be xiaowang")
    if not item_exist(item_id):
        raise Exception("item id must exist")
    delete(item_id)


4.总结


(1).assert语句通常用来对代码进行必要的自我检查,表明你很确定这种情况一定会发生或者一定不会发生。
(2).值得注意的是:使用assert时,一定不要加括号,否则会报错!
(3).代码中的assert语句,可以在运行python程序时通过-O选项进行去使能。
(4).不能乱用assert,很多情况下,程序中出现的不同情况都是意料之中的,需要我们用不同的方法去处理,此时用条件语句进行判断更合适。对应程序中的一些run-time error,请使用异常进行处理。

相关文章
|
15天前
|
存储 Shell 区块链
怎么把Python脚本打包成可执行程序?
该文档介绍了如何将Python脚本及其运行环境打包成EXE可执行文件,以便在不具备Python环境的计算机上运行。首先确保Python脚本能够正常运行,然后通过安装PyInstaller并使用`--onefile`参数将脚本打包成独立的EXE文件。此外,还提供了去除命令行窗口和指定可执行文件图标的详细方法。这些步骤帮助用户轻松地将Python程序分发给最终用户。
怎么把Python脚本打包成可执行程序?
|
10天前
|
Python
探索Python编程的奥秘:打造你的第一个程序
【9月更文挑战第8天】本文将带你进入Python编程的世界,通过一个有趣的项目——制作一个简单的猜数字游戏,让你快速入门。我们不仅会分享代码编写的步骤,还会讲解每一行代码的含义和作用,确保即使是编程新手也能跟上节奏。文章末尾附有完整代码,方便读者实践和学习。
23 12
|
6天前
|
JSON 监控 数据挖掘
Python I/O管理新篇章:优化你的程序,让数据流动更顺畅
【9月更文挑战第13天】在数据驱动时代,Python因其在数据分析、科学计算及Web开发中的广泛应用而备受青睐。本文探讨了Python I/O管理的关键方面,包括理解I/O瓶颈、使用缓冲技术、并发与异步I/O、高效数据序列化及监控调试。通过具体示例,展示了如何优化文件读写和网络通信,提高程序性能。掌握这些技能,可使数据在程序中流动更加顺畅。
23 3
|
6天前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
12 3
|
7天前
|
监控 Python Windows
python知识点100篇系列-pysnooper用于调试
PySnooper是一个便捷的Python调试工具,用于监控代码执行过程及局部变量的变化,替代繁琐的打印语句。作为GitHub上的热门开源项目,它通过装饰器自动记录代码执行细节。安装简便,支持多种平台,可通过pip安装。使用时,只需在目标函数上添加装饰器即可实时查看变量变化或将其记录至日志文件。此外,还支持使用with块对特定代码段进行调试。更多详细信息可参阅其官方使用文档。
python知识点100篇系列-pysnooper用于调试
|
14天前
|
算法 程序员 Linux
Python编程入门:构建你的第一个程序
【9月更文挑战第4天】编程是现代技术发展的基石,而Python作为一门简洁、易学且功能强大的编程语言,已成为众多初学者的首选。本文将引导你通过一个简单的Python程序,探索编程世界的奥秘,并了解如何利用Python实现基本的算法逻辑。无论你是完全的新手还是希望巩固基础的开发者,这篇文章都将为你提供一个清晰的学习路径。从安装Python环境开始,到编写第一个程序,我们将一步步揭开编程的神秘面纱。
|
20天前
|
Python
Python编程入门:构建你的第一个程序
【8月更文挑战第31天】本文是面向初学者的Python编程指南,将引导读者通过实际案例学习Python基础。我们将一起编写一个简单的程序来展示如何运用变量、控制结构和函数等概念。文章末尾附有完整代码示例供参考和实践。
使用icecream优雅调试Python代码
在大型项目中,使用print()调试代码可能导致终端输出过多,难以分辨输出结果与代码的对应关系。为了更清晰地调试,可以采用Icecream库。通过使用Icecream,可以更有效地进行Python代码调试,同时保持代码的整洁性。
|
19天前
|
小程序 Python
Python 编程入门:打造你的第一个程序
【8月更文挑战第31天】 在数字化时代,编程已成为一项宝贵的技能。本文将通过一个简单示例引导初学者步入Python编程的世界。我们将从基础语法开始,逐步构建一个小程序,并在此过程中探索编程的逻辑思维与问题解决策略。无论你是科技爱好者还是职场新人,这篇文章都将为你开启编程之旅提供助力。
|
19天前
|
程序员 Python
Python 编程入门:打造你的第一个程序
【8月更文挑战第31天】编程初学者常常在起步时感到迷茫。本文将通过浅显易懂的方式,带领读者从零开始,一步步构建他们的第一个 Python 程序。我们将探索 Python 的安装、基础语法,并通过一个实际的项目——简易计算器,来巩固学习成果。无论你的背景如何,这篇文章都将为你打开编程世界的大门,让你轻松上手,享受编程的乐趣。