你真的会调试你的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,请使用异常进行处理。

相关文章
|
11天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
11天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
14天前
|
存储 JSON 监控
告别Print,使用IceCream进行高效的Python调试
本文将介绍**IceCream**库,这个专门用于调试的工具显著提升了调试效率,使整个过程更加系统化和规范化。
37 2
告别Print,使用IceCream进行高效的Python调试
|
13天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
23天前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
56 3
|
25天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
28 3
|
28天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
20 3
|
1月前
|
IDE 开发工具 Python
Python 编程入门:打造你的第一个程序
【10月更文挑战第6天】编程,这个听起来高大上又充满神秘感的领域,其实就像学习骑自行车一样。一开始你可能会觉得难以掌握平衡,但一旦你学会了,就能自由地穿梭在广阔的道路上。本文将带你走进 Python 的世界,用最简单的方式让你体验编写代码的乐趣。不需要复杂的理论,我们将通过一个简单的例子——制作一个猜数字游戏,来实践学习。准备好了吗?让我们开始吧!
|
18天前
|
存储 机器学习/深度学习 搜索推荐
Python编程入门:从零开始构建你的第一个程序
【10月更文挑战第32天】本文旨在通过浅显易懂的方式引导编程新手进入Python的世界。我们将一起探索Python的基础语法,并通过实例学习如何构建一个简单的程序。文章将不直接展示代码,而是鼓励读者在阅读过程中自行尝试编写,以加深理解和记忆。无论你是编程初学者还是希望巩固基础知识的开发者,这篇文章都将是你的良师益友。让我们开始吧!
|
1月前
|
存储 JSON 安全
面向企业应用程序的 Python 配置管理
面向企业应用程序的 Python 配置管理
29 9
下一篇
无影云桌面