Python断言(assert)

这篇具有很好参考价值的文章主要介绍了Python断言(assert)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python实用教程_spiritx的博客-CSDN博客

断言定义

Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linux 系统下运行,可以先判断当前系统是否符合条件。

语法格式如下:

assert expression

等价于:

if not expression:
    raise AssertionError

assert 后面也可以紧跟参数:

assert expression [, arguments]

等价于:

if not expression:
    raise AssertionError(arguments)
>>> assert True     # 条件为 true 正常执行
>>> assert False    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1==1    # 条件为 true 正常执行
>>> assert 1==2    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

>>> assert 1==2, '1 不等于 2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 1 不等于 2
>>>

一般用法

assert expression

用来让程序测试这个expression,如果expression为false,那么raise一个AssertionError出来。

>>> assert 1==1
>>> assert 1==0
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    assert 1==0
AssertionError
>>> assert True
>>> assert False
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    assert False
AssertionError
>>> assert 3<2
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    assert 3<2
AssertionError

注意:assert 在 Python 3 中只是声明,不能写成下面形式:

assert(False, "Error")

 这种形式,断言将永远不会被触发。因为此时 assert 的 expression 参数是内容为 (.., ..) 的 Tuple ,而 Tuple 只有在内容为空的时候才会被判断为 False

带异常参数的断言

>>> assert len(lists) >=5,'列表元素个数小于5'

Traceback (most recent call last):
File "D:/Data/Python/helloworld/helloworld.py", line 1, in <module>
assert 2>=5,'列表元素个数小于5'
AssertionError: 列表元素个数小于5

>>> assert 2==1,'2不等于1'

Traceback (most recent call last):
File "D:/Data/Python/helloworld/helloworld.py", line 1, in <module>
assert 2==1,'2不等于1'
AssertionError: 2不等于1

启用和禁用断言

首先,要知道Python解释器在运行时有两种模式:

  • 调试模式,该模式下,内置只读变量__debug__为True。
  • 优化模式,当使用选项-O运行时,即python.exe -O demo.py为优化模式,内置只读变量__debug__为False。
    来看示例,有Python文件内容是:
a=1
b=-1
assert a > 0 and b > 0
print('Game Over')

分别使用两种模式运行该文件,先来看正常的调试模式:

$ python demo5.py
Traceback (most recent call last):
  File "demo5.py", line 3, in <module>
    assert a > 0 and b > 0
                     ^^^^^
AssertionError

此时上述Python文件在调试模式下,触发了assert条件执行,并引发AssertionError异常。
再来看优化模式:

$ python -O demo5.py
Game Over

在调优模式下,断言语句被禁用。

在调优模式下,在一定程度上提高了程序执行效率,但是这相当于埋下了一颗雷。
那么我们应该什么时候应该使用断言呢?一般的,如果没有特别的目的,断言应该用于:

  • 防御性的编程环境中。
  • 运行时对程序逻辑的检测。
  • 合约性检查,比如前置/后置条件检查。
  • 程序中的常量。
  • 检查文档。
  • 代码测试中。

当然,一些情况下,也不建议使用断言:

  • 不要用于测试用户提供的数据,或者那些需要在所有情况下需要改变检查的地方
  • 不要用于检查你认为在通常使用中可能失败的地方。断言用于非常特别的失败条件。你的用户绝不看到一个AssertionError,如果看到了,那就是个必须修复的缺陷。
  • 特别地不要因为断言只是比一个明确的测试加一个触发异常矮小而使用它。断言不是懒惰的代码编写者的捷径。
  • 不要将断言用于公共函数库输入参数的检查,因为你不能控制调用者,并且不能保证它不破坏函数的合约。
  • 不要将断言用于你期望修改的任何错误。换句话,你没有任何理由在产品代码捕获一个AssertionError异常。
  • 不要太多使用断言,它们使代码变得晦涩难懂。

关于优化

  • 启用、禁用断言
  • 一些建议
  • 最后的扩展
  • 返回上一页

About#

在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃。

这时,就要用到断言assert了,Python中的断言语句格式用法很简单。

断言 assert 是指期望用户指定的条件满足,它是当用户定义的约束条件不满足时触发AssertionError异常,因此 assert 语句可以视为条件式的 raise 语句。它的主要功能是帮助程序员调试程序,从而保证程序运行的准确性,一般在开发调试阶段使用。

assert的使用#

assert的一般用法

assert condition

assert判断条件(condition)是否成立,如果不成立,则抛出异常,逻辑上等同于:

if not condition:
	raise AssertionEerror()
	
a = ''
# assert a

if not a:
    raise AssertionError('a等于空')

assert的另一种形式

assert condition, expression

如果condition为False,就raise一个描述为expression的AssertionError的错误出来,逻辑上等同于:

if not condition:
	raise AssertionEerror(expression)

a = ''
# assert a, 'a是空的啦'

if not a:
    raise AssertionError('a等于空')

启用、禁用断言#

首先,要知道Python解释器在运行时有两种模式:

  • 调试模式,该模式下,内置只读变量__debug__为True。
  • 优化模式,当使用选项-O运行时,即python.exe -O demo.py为优化模式,内置只读变量__debug__为False。
    来看示例,有Python文件内容是:
a = ''
# assert a, 'a是空的啦'

if not a:
    raise AssertionError('a等于空')

我们分别使用两种模式运行该文件,先来看正常的调试模式:

M:\>python testsss.py
Traceback (most recent call last):
  File "testsss.py", line 56, in <module>
    assert a, 'a是空的啦'
AssertionError: a是空的啦

此时上述Python文件在调试模式下,触发了assert条件执行,并引发AssertionError异常。
再来看优化模式:

M:\>python -O testsss.py
Traceback (most recent call last):
  File "testsss.py", line 59, in <module>
    raise AssertionError('a等于空')
AssertionError: a等于空

由报错内容可以发现,在调优模式下,断言语句被禁用,报错语句是我们手写if判断引发的。

一些建议#

在调优模式下,在一定程度上提高了程序执行效率,但是这相当于埋下了一颗雷。
那么我们应该什么时候应该使用断言呢?一般的,如果没有特别的目的,断言应该用于:

  • 防御性的编程环境中。
  • 运行时对程序逻辑的检测。
  • 合约性检查,比如前置/后置条件检查。
  • 程序中的常量。
  • 检查文档。
  • 代码测试中。

当然,一些情况下,也不建议使用断言:

  • 不要用于测试用户提供的数据,或者那些需要在所有情况下需要改变检查的地方
  • 不要用于检查你认为在通常使用中可能失败的地方。断言用于非常特别的失败条件。你的用户绝不看到一个AssertionError,如果看到了,那就是个必须修复的缺陷。
  • 特别地不要因为断言只是比一个明确的测试加一个触发异常矮小而使用它。断言不是懒惰的代码编写者的捷径。
  • 不要将断言用于公共函数库输入参数的检查,因为你不能控制调用者,并且不能保证它不破坏函数的合约。
  • 不要将断言用于你期望修改的任何错误。换句话,你没有任何理由在产品代码捕获一个AssertionError异常。
  • 不要太多使用断言,它们使代码变得晦涩难懂。

最后的扩展#

默认的,__debug__是常量,包括None、False、True这些常量不能重新赋值(即使作为属性名赋值给它们,也会引发SyntaxError),因此可以将它们视为“True”常量。

if __debug__:
	print('debug模式')

关于-O,在命令行的环境下,使用python.exe -O demo.py时,将会删除(可以理解为忽略)assert语句和任何基于__debug__值的代码。详见PEP 488。
关于-OO,在命令行的环境下,使用python.exe -OO demo.py时,将会丢弃文档字符串。详见PEP 488。

def foo():
    """ docstrings """
    pass

if __debug__:
    help(foo)

上述代码,使用python.exe demo.py会返回foo函数的文档信息。而使用python.exe -OO demo.py后,foo函数的文档信息将不会返回。文章来源地址https://www.toymoban.com/news/detail-704413.html

到了这里,关于Python断言(assert)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • assert 是一个断言语句

            在 Python 中, assert  是一个断言语句,用于测试代码中的条件是否为真。它的语法如下:         其中, condition  是要测试的条件,如果条件为真( True ),则程序继续执行;如果条件为假( False ),则会触发  AssertionError  异常,并且可以选择性地提供一个

    2024年02月05日
    浏览(37)
  • SpringBoot单元测试断言 assertions

    断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。JUnit 5 内置的断言可以分成如下几个类别: 1、简单断言 2、数组断言 通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等

    2024年02月05日
    浏览(43)
  • Java断言(assert)的介绍和使用

    在Java编程中,断言(assert)是一种有用的工具,用于在代码中进行条件检查和调试。通过使用断言,我们可以验证程序的逻辑和假设,确保程序在运行时达到预期的结果。本文将介绍Java中的断言概念以及如何使用断言来提高代码的可靠性和调试效率。 断言是一种在程序中添

    2024年02月05日
    浏览(35)
  • Unitest单元测试,常用断言方法Assertion

    unittest库提供了很多实用方法来检测程序运行的结果和预期。包括三种类型的方法,每一种都覆盖了典型的类型,比如: 检查相等值、逻辑比较、异常 如果给定的Assertion通过了,那么测试会执行下一行代码。如果给定的assertion没有通过,测试会暂停并且生成错误信息。unitt

    2024年02月05日
    浏览(56)
  • Pytest系列(2) - assert断言详细使用

    与unittest不同,pytest使用的是python自带的assert来进行断言 assert后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败 想在抛出异常之后输出一些提示信息,执行之后就方便查看是什么原因了 执行结果 pytest 里面

    2024年01月20日
    浏览(46)
  • Pytest系列- assert断言详细使用(4)

    在断言方面,pytest框架比其他类似的框架(比如unittest)更加简洁,易用,我想这是选择pytest作为自动化测试框架之一的原因之一。 pytest的assert断言支持使用python内置的assert表达式。可以理解为pytest的断言就是直接使用python自带的assert。 assert后面可以接一

    2024年02月09日
    浏览(36)
  • 【system verilog】SV Assertion 断言

    SystemVerilog Assertion(SVA)–断言 一言以蔽之:断言是设计属性的描述。 如果一个在模拟中被检查的属性(property)不像我们期望的那样表现,那么这个断言失败。 如果一个被禁止在设计中出现的属性在模拟过程中发生,那么这个断言失败。 一系列的属性可以从设计的功能描述中推

    2024年02月16日
    浏览(39)
  • 【Java高级特性】(二)断言机制 Assertion:关于断言机制最全面的讲解来了~

    掌握断言机制的概念、作用与使用; 掌握如何自定义异常; 1.1 概念 断言机制是一种编程技术,用于在程序中检查和验证假设或前提条件是否为真。在软件开发过程中,断言常被用于确保程序代码按照预期执行,并且在遇到错误或异常情况时能够提供有用的诊断信息。 断言

    2024年02月12日
    浏览(30)
  • Java 断言 assert 你真的会用嘛?

    Java面试总结汇总,整理了包括Java重点知识,以及常用开源框架,欢迎大家阅读。文章可能有错误的地方,因为个人知识有限,欢迎各位大佬指出!文章持续更新中...... 什么是Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、

    2024年02月09日
    浏览(37)
  • gtest语法(二)ASSERT_*和EXPECT_*断言

    这篇文章主要总结gtest中的所有断言相关的宏。 gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是: ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。 EXPECT_* 系列的断言,当检查点失败时,继续

    2023年04月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包