找回密码
 会员注册
查看: 24|回复: 0

Python断言(assert)

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71916
发表于 2024-9-8 13:47:38 | 显示全部楼层 |阅读模式
Python实用教程_spiritx的博客-CSDN博客断言定义Pythonassert(断言)用于判断一个表达式,在表达式条件为false的时候触发异常。断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在Linux系统下运行,可以先判断当前系统是否符合条件。语法格式如下:assertexpression等价于:ifnotexpression:raiseAssertionErrorassert后面也可以紧跟参数:assertexpression[,arguments]等价于:ifnotexpression:raiseAssertionError(arguments)>>>assertTrue#条件为true正常执行>>>assertFalse#条件为false触发异常Traceback(mostrecentcalllast):File"",line1,inAssertionError>>>assert1==1#条件为true正常执行>>>assert1==2#条件为false触发异常Traceback(mostrecentcalllast):File"",line1,inAssertionError>>>assert1==2,'1不等于2'Traceback(mostrecentcalllast):File"",line1,inAssertionError:1不等于2>>>一般用法assertexpression用来让程序测试这个expression,如果expression为false,那么raise一个AssertionError出来。>>>assert1==1>>>assert1==0Traceback(mostrecentcalllast):File" ",line1,inassert1==0AssertionError>>>assertTrue>>>assertFalseTraceback(mostrecentcalllast):File" ",line1,inassertFalseAssertionError>>>assert3",line1,inassert3>>assertlen(lists)>=5,'列表元素个数小于5'Traceback(mostrecentcalllast):File"D:/Data/Python/helloworld/helloworld.py",line1,inassert2>=5,'列表元素个数小于5'AssertionError:列表元素个数小于5>>>assert2==1,'2不等于1'Traceback(mostrecentcalllast):File"D:/Data/Python/helloworld/helloworld.py",line1,inassert2==1,'2不等于1'AssertionError:2不等于1启用和禁用断言首先,要知道Python解释器在运行时有两种模式:调试模式,该模式下,内置只读变量__debug__为True。优化模式,当使用选项-O运行时,即python.exe-Odemo.py为优化模式,内置只读变量__debug__为False。来看示例,有Python文件内容是:a=1b=-1asserta>0andb>0print('GameOver')分别使用两种模式运行该文件,先来看正常的调试模式:$pythondemo5.pyTraceback(mostrecentcalllast):File"demo5.py",line3,inasserta>0andb>0^^^^^AssertionError此时上述Python文件在调试模式下,触发了assert条件执行,并引发AssertionError异常。再来看优化模式:$python-Odemo5.pyGameOver'运行运行在调优模式下,断言语句被禁用。在调优模式下,在一定程度上提高了程序执行效率,但是这相当于埋下了一颗雷。那么我们应该什么时候应该使用断言呢?一般的,如果没有特别的目的,断言应该用于:防御性的编程环境中。运行时对程序逻辑的检测。合约性检查,比如前置/后置条件检查。程序中的常量。检查文档。代码测试中。当然,一些情况下,也不建议使用断言:不要用于测试用户提供的数据,或者那些需要在所有情况下需要改变检查的地方不要用于检查你认为在通常使用中可能失败的地方。断言用于非常特别的失败条件。你的用户绝不看到一个AssertionError,如果看到了,那就是个必须修复的缺陷。特别地不要因为断言只是比一个明确的测试加一个触发异常矮小而使用它。断言不是懒惰的代码编写者的捷径。不要将断言用于公共函数库输入参数的检查,因为你不能控制调用者,并且不能保证它不破坏函数的合约。不要将断言用于你期望修改的任何错误。换句话,你没有任何理由在产品代码捕获一个AssertionError异常。不要太多使用断言,它们使代码变得晦涩难懂。关于优化启用、禁用断言一些建议最后的扩展返回上一页About#在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃。这时,就要用到断言assert了,Python中的断言语句格式用法很简单。断言assert是指期望用户指定的条件满足,它是当用户定义的约束条件不满足时触发AssertionError异常,因此assert语句可以视为条件式的raise语句。它的主要功能是帮助程序员调试程序,从而保证程序运行的准确性,一般在开发调试阶段使用。assert的使用#assert的一般用法assertconditionassert判断条件(condition)是否成立,如果不成立,则抛出异常,逻辑上等同于:ifnotcondition: raiseAssertionEerror() a=''#assertaifnota:raiseAssertionError('a等于空')assert的另一种形式assertcondition,expression如果condition为False,就raise一个描述为expression的AssertionError的错误出来,逻辑上等同于:ifnotcondition: raiseAssertionEerror(expression)a=''#asserta,'a是空的啦'ifnota:raiseAssertionError('a等于空')启用、禁用断言#首先,要知道Python解释器在运行时有两种模式:调试模式,该模式下,内置只读变量__debug__为True。优化模式,当使用选项-O运行时,即python.exe-Odemo.py为优化模式,内置只读变量__debug__为False。来看示例,有Python文件内容是:a=''#asserta,'a是空的啦'ifnota:raiseAssertionError('a等于空')我们分别使用两种模式运行该文件,先来看正常的调试模式:M:\>pythontestsss.pyTraceback(mostrecentcalllast):File"testsss.py",line56,inasserta,'a是空的啦'AssertionError:a是空的啦此时上述Python文件在调试模式下,触发了assert条件执行,并引发AssertionError异常。再来看优化模式:M:\>python-Otestsss.pyTraceback(mostrecentcalllast):File"testsss.py",line59,inraiseAssertionError('a等于空')AssertionError:a等于空由报错内容可以发现,在调优模式下,断言语句被禁用,报错语句是我们手写if判断引发的。一些建议#在调优模式下,在一定程度上提高了程序执行效率,但是这相当于埋下了一颗雷。那么我们应该什么时候应该使用断言呢?一般的,如果没有特别的目的,断言应该用于:防御性的编程环境中。运行时对程序逻辑的检测。合约性检查,比如前置/后置条件检查。程序中的常量。检查文档。代码测试中。当然,一些情况下,也不建议使用断言:不要用于测试用户提供的数据,或者那些需要在所有情况下需要改变检查的地方不要用于检查你认为在通常使用中可能失败的地方。断言用于非常特别的失败条件。你的用户绝不看到一个AssertionError,如果看到了,那就是个必须修复的缺陷。特别地不要因为断言只是比一个明确的测试加一个触发异常矮小而使用它。断言不是懒惰的代码编写者的捷径。不要将断言用于公共函数库输入参数的检查,因为你不能控制调用者,并且不能保证它不破坏函数的合约。不要将断言用于你期望修改的任何错误。换句话,你没有任何理由在产品代码捕获一个AssertionError异常。不要太多使用断言,它们使代码变得晦涩难懂。最后的扩展#默认的,__debug__是常量,包括None、False、True这些常量不能重新赋值(即使作为属性名赋值给它们,也会引发SyntaxError),因此可以将它们视为“True”常量。if__debug__: print('debug模式')关于-O,在命令行的环境下,使用python.exe-Odemo.py时,将会删除(可以理解为忽略)assert语句和任何基于__debug__值的代码。详见PEP488。关于-OO,在命令行的环境下,使用python.exe-OOdemo.py时,将会丢弃文档字符串。详见PEP488。deffoo():"""docstrings"""passif__debug__:help(foo)上述代码,使用python.exedemo.py会返回foo函数的文档信息。而使用python.exe-OOdemo.py后,foo函数的文档信息将不会返回。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 19:13 , Processed in 0.862685 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表