(这就是为什么使用断言的时机会不同。因为我们对代码正确性的信息不同,对于一个人有用的断言,对于另一个人来说却是无用的运行时测试。)

另一个断言用得好的地方就是检查程序中的不变量。一个不变量是一些你能相信为真的条件,除非一个缺陷导致它变成假。如果有一个缺陷,越早发现越好,因此我们需要对其进行测试,但我们不想因为这些测试而影响代码执行速度。因此采用断言,它能在开发时生效而在产品中失效。

一个关于不变量的例子可能是这样的情况。如果你的函数在开始的时候期望一个打开的数据库连接,并且在函数返回后该数据库连接依然是打开的,这是一个函数的不变量:

断言也是一个很好的检查点注释。为了替代如下注释:

#当我们执行到这里,我们知道n>2

你可以确保在运行时用以下断言:

断言也是一种防御性的编程形式。你不是在防范当前代码发生错误,而防范由于以后的代码变更发生错误。理想情况下,单元测试应该直到这个作用,但是让我们面对这样一个现实:即使存在单元测试,他们在通常情况下也不是很完备。内建的机器人可能没有工作,但数周以来也没有人注意到它,或者人们在提交代码之前忘记了执行测试。内部检查将是防止错误渗入的另一道防线,尤其对于那些悄悄地失败,但会引起代码功能错误并返回错误结果的情况有效。

假设你有一系列的if...elif代码块,你预先知道变量期望的值:

假设这段代码现在完全正确。但它会一直正确吗?需求变更,代码变更。如果需求变为允许target = w,并关联到run_w_code,那将会发生什么情况?如果我们变更了设置target的代码,但是忘记了改变这个代码块,它就会错误地调用run_z_code(),错误就会发生。对于这段代码最好的方法就是编写一些防御性的检查,这样它的执行,即使在变更以后,要么正确,要么马上失败。

在代码开始添加注释是个好的开端,但是人们都不太喜欢读和更新这些注释,这些注释会很快变得过时。但对于断言,我们可以同时对这块代码编写文档,如果这些断言被违反了,会直接引起一个简单而又直接的失败。

这里的断言同时用于防御性编程和检查文档。我认为这是最优的解决方案:

这诱使开发者去不理代码,移除像value ==c这类不必要的测试,以及RuntimeError的“死代码”。另外,当"unexpected error"错误发生时这个消息将非常窘迫,确实会发生。

合约式设计是断言另一个用得好的地方。在合约式设计中,我们认为函数与其他调用者遵循合约,例如像这样的情况:

“如果你传给我一个非空字符串,我保证返回转换成大写的首字母。”

如果合约被破坏了,不管是被函数本身还是调用者,这都会产生缺陷。我们说这个函数需要有前置条件(对期望的参数的限制)和后置条件(对返回结果的约束)。因此这个函数可能是这样的:

合约式设计的目的是,在一个正确的程序里,所有的前置条件和后置条件都将得到处理。这是断言的经典应用,自(这个想法持续)我们发布无缺陷的程序并且将其放入产品,程序将是正确的并且我们可以放心地移除检查。

这里是我建议不使用断言的情况:

*不要用于测试用户提供的数据,或者那些需要在所有情况下需要改变检查的地方

*不要用于检查你认为在通常使用中可能失败的地方。断言用于非常特别的失败条件。你的用户绝不看到一个AssertionError,如果看到了,那就是个必须修复的缺陷。

*特别地不要因为断言只是比一个明确的测试加一个触发异常矮小而使用它。断言不是懒惰的代码编写者的捷径。

*不要将断言用于公共函数库输入参数的检查,因为你不能控制调用者,并且不能保证它不破坏函数的合约。

*不要将断言用于你期望修改的任何错误。换句话,你没有任何理由在产品代码捕获一个AssertionError异常。

*不要太多使用断言,它们使代码变得晦涩难懂。

python assert_Python中何时使用断言 assert相关推荐

  1. python(11)-if语句,断言assert

    分支语句if 1.if基本语法 2 if语句的嵌套 3 比较运算符号 4 逻辑运算符: 5 整数随机数初应用 6 tip 7.断言assert 1.if基本语法 if语句开发中的应用场景:如果条件成立 ...

  2. eclipse/myeclipse中如何开启断言调试代码

    转载:http://blog.csdn.net/emperorjade/article/details/32140763       assertion(断言)在软件开发中是一种常用的调试方式,很多开 ...

  3. python断言assertequal_python中那个断言assert的优化

    Python Assert 为何不尽如人意# Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. Copy >>> assert ...

  4. python中assert_在Python中带有示例的assert关键字

    python中assert Python断言关键字 (Python assert keyword) assert is a keyword (case-sensitive) in python, it ...

  5. python断言assert实例_Python 拓展之断言(assert)

    写在之前 大家好,这是首发在我公众号「Python空间」的第 60 篇文章,欢迎关注,期待和你的交流. 在昨天的文章中(零基础学习 Python 之处理异常)中学习了处理异常的正确姿势,今天我们继续来 ...

  6. python断言assert实例_python接口测试assert断言

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! unittest.texttestrunner(verbosity=2).run ...

  7. Java中的断言(assert)

    为什么80%的码农都做不了架构师?>>>    一.语法形式:     Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion), ...

  8. python断言assert实例_Python断言assert的用法代码解析

    在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明 ...

  9. 理解和正确使用Java中的断言(assert)

    理解和正确使用Java中的断言(assert) 一.语法形式:     Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion),它的 语法形式有如 ...

最新文章

  1. LeetCode 795. Number of Subarrays with Bounded Maximum
  2. 云南省2021高考成绩查询时间,2021云南高考成绩什么时候几点可以查
  3. vs(visual studio)调试功能里各个按钮的意义及使用方法?
  4. 【数据中台】你的企业是否需要建设数据中台?
  5. charles 安装 ssl_charles抓包配置
  6. Struts 2 Spring Hibernate三大框架的执行流程以及原理
  7. Python学习笔记:目录与文件操作
  8. restTemplate配置及使用
  9. 2021年青海省大学生首届网络安全知识与技能大赛——赛题回顾及基本讲解
  10. wxpython grid设置字体颜色_Ext grid改变行背景颜色 和改变行字体颜色
  11. 汉字乱码的终极解决方案
  12. EXCEL慢的解决方法
  13. red hat linux 9下载地址,Red Hat Linux 9.0 ISO下载 (转)
  14. 凸优化学习笔记 6:共轭函数
  15. mysql in 分组,基于mysql实现group by取各分组最新一条数据
  16. python批量读取txt数据并写入csv
  17. win10中jdk安装详细安装过程
  18. xms java_java xms xmx xmn xss解释
  19. 使用域名访问后台系统、Nginx反向代理服务器
  20. web百度离线地图开发(详细教程)2019

热门文章

  1. 洛谷 1485 火枪打怪
  2. wireshark帮你解析网络包
  3. php访问方法外变量
  4. 关于Object[]数组强转成Integer[]类型的数组.
  5. httplib模块,测试cdn节点文件同步
  6. 各数据类型的取值范围及占用字节数。。
  7. [转载] 多元线性回归 及其Python实现
  8. 项目案例模板之登录注册的实现
  9. 使用 v-cloak 防止页面加载时出现 vuejs 的变量名
  10. Entrust是一种为Laravel5添加基于角色的权限的简洁而灵活的方法。