assert

断言assert用法

感情迁移 提交于 2020-03-21 10:27:38
本文转自:http://blog.jobbole.com/76285/ 这个问题是如何在一些场景下使用断言表达式,通常会有人误用它,所以我决定写一篇文章来说明何时使用断言,什么时候不用。 为那些还不清楚它的人,Python的assert是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则会抛出AssertError并且包含错误信息。例如: 1 2 3 4 5 6 py> x = 23 py> assert x > 0 , "x is not zero or negative" py> assert x% 2 == 0 , "x is not an even number" Traceback (most recent call last): File "" , line 1 , in AssertionError: x is not an even number 很多人用assert作为一个很快和容易的方法来在参数错误的时候抛出异常。但这样做是错的,非常错误,有两个原因。首先AssertError不是在测试参数时应该抛出的错误。你不应该像这样写代码: 1 2 if not isinstance(x, int ): raise AssertionError( "not an int" ) 你应该抛出TypeError的错误,assert会抛出错误的异常。 但是,更危险的是

DELPHI中BUG修改备忘

纵然是瞬间 提交于 2020-03-17 19:47:38
1. 关于sizeof 同样的代码 var LWindCode : array [0..15] of char; begin showmessage(inttostr( sizeof(LWindCode))); end; 在Delphi7和Delphi2009下结果分别是16/32,为什么? 这是因为widechar和AnsiChar的问题,2009默认的是WideChar了,而Delphi7是AnsiChar,导致String的长度也发生了变化!以后要注意了! 2. 关于Assigned Assigned只是判断当前值是否为空,而不判断当前指着的内存是不是被释放,因此释放的时候要这样写: if assigned(frm) then begin frm.close; frm:=nil; end; 或者 if assigned(frm) then begin frm.close; freeandnil(frm); end; 3. 关于assert(断言) 用法: Assert(表达式); 如果为假, assert会产生一个EAssertionFailed异常,显示信息为: Assertion Failed (C:\src\unit1.pas, [size=+0]line 34) 当你不想再使用这些检查时,可以使用 {$ASSERTIONS OFF} 或 {$C-} 编译指令.

python assert断言函数

巧了我就是萌 提交于 2020-03-12 07:34:50
python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假。 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。 self.assertEqual(a,b,msg=msg) #判断a与.b是否一致,msg类似备注,可以为空 self.assertNotEqual(a,b,msg=msg) #判断a与b是否不一致 self.assertTrue(a,msg=none) #判断a是否为True self.assertFalse(b,msg=none) #判断b是否为false self.assertAlmostEqual(a,b,places=none,msg=none,delta=none) #该判断过程有点复杂,判断过程如下 注:places与delta不能同时存在,否则出异常 #若a==b,则直接输入正确,不判断下面的过程 #若delta有数,places为空,判断a与b的差的绝对值是否<=delta,满足则正确,否则错误 #若delta为空,places有数,判断b与a的差的绝对值,取小数places位,等于0则正确,否则错误 #若delta为空,places为空,默认赋值places=7判断 例 assertAlmostEqual(2,2) 正确, assertAlmostEqual(5,2

python assert断言函数

早过忘川 提交于 2020-03-12 07:33:59
python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假。 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。 self.assertEqual(a,b,msg=msg) #判断a与.b是否一致,msg类似备注,可以为空 self.assertNotEqual(a,b,msg=msg) #判断a与b是否不一致 self.assertTrue(a,msg=none) #判断a是否为True self.assertFalse(b,msg=none) #判断b是否为false self.assertAlmostEqual(a,b,places=none,msg=none,delta=none) #该判断过程有点复杂,判断过程如下 注:places与delta不能同时存在,否则出异常 #若a==b,则直接输入正确,不判断下面的过程 #若delta有数,places为空,判断a与b的差的绝对值是否<=delta,满足则正确,否则错误 #若delta为空,places有数,判断b与a的差的绝对值,取小数places位,等于0则正确,否则错误 #若delta为空,places为空,默认赋值places=7判断 例 assertAlmostEqual(2,2) 正确, assertAlmostEqual(5,2

Python中何时使用断言 assert

让人想犯罪 __ 提交于 2020-03-12 07:33:04
使用断言的最佳时机偶尔会被提起,通常是因为有人误用,因此我觉得有必要写一篇文章来阐述一下什么时候应该用断言,为什么应该用,什么时候不该用。 对那些没有意识到用断言的最佳时机的人来说,Python的断言就是检测一个条件,如果条件为真,它什么都不做;反之它触发一个带可选错误信息的AssertionError。如下例所示: 很多人将断言作为当传递了错误的参数值时的一种快速而简便的触发异常的方式。但实际上这是错误的,而且是非常危险的错误,原因有两点。首先,AssertionError通常是在测试函数参数时给出的错误。你不会像下面这样编码: 你应该用TypeError来替代,“断言”解决了错误的异常类型。 但是对断言来说更危险也更纠结的是:如果你执行Python时使用了-O或-OO优化标识,这能够通过编译却从来不会被执行,实际上就是说并不能保证断言会被执行。当恰当地使用了断言,这非常好的,但当不恰当地使用了断言,在使用-O标识执行时它将导致代码被彻底中断。 那么我们什么时候应该使用断言呢?如果没有特别的目的,断言应该用于如下情况: 防御性的编程 运行时对程序逻辑的检测 合约性检查(比如前置条件,后置条件) 程序中的常量 检查文档 (断言也可以用于代码测试,用作一个做事毛手毛脚的开发人员的单元测试,只要能你接受当使用-O标志时这个测试什么都不做。我有时也会在代码中用"assert Fasle

C++11 static_assert

♀尐吖头ヾ 提交于 2020-03-12 05:22:47
C++0x中引入了 static_assert 这个关键字,用来做编译期间的断言,因此叫做静态断言。 其语法: static_assert (常量表达式,提示字符串)。 如果第一个参数常量表达式的值为false,会产生一条编译错误,错误位置就是该 static_assert 语句所在行,第二个参数就是错误提示字符串。 使用 static_assert ,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。 static_assert 可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。 编译器在遇到一个 static_assert 语句时,通常立刻将其第一个参数作为常量表达式进行演算,但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能。 由于之前有望加入C++0x标准的 concepts 提案最终被否决了,因此对于检查模板参数是否符合期望的重任,就要靠 static_assert 来完成了,所以如何构造适当的常量表达式,将是一个值得探讨的话题。 性能方面,由于是 static_assert 编译期间断言,不生成目标代码,因此 static_assert 不会造成任何运行期性能损失。 简单范例: static_assert(sizeof

谁有115资源分享

℡╲_俬逩灬. 提交于 2020-03-08 08:40:08
基于 Redis 实现 CAS 操作 Intro 在 .NET 里并发情况下我们可以使用 Interlocked.CompareExchange 来实现 CAS (Compare And Swap) 操作,在分布式的情景下很多时候我们都会使用 Redis ,最近在改之前做的一个微信小游戏项目,之前是单机运行的,有些数据存储是基于内存的,直接基于对象操作的,最近要改成支持分布式的,于是引入了 redis,原本基于内存的数据就要迁移到 redis 中存储,原来的代码里有一些地方使用了 Interlocked.CompareExchange 来实现 CAS 操作,迁移到 redis 中之后也需要类似的功能,于是就想基于 redis 实现 CAS 操作。 CAS CAS (Compare And Swap) 通常可以使用在并发操作中更新某一个对象的值,CAS 是无锁操作,CAS 相当于是一种乐观锁,而直接加锁相当于是悲观锁,所以相对来说 CAS 操作 是会比直接加锁更加高效的。 Redis Lua redis 从 2.6.0 版本开始支持 Lua 脚本,Lua 脚本的执行是原子性的,所以我们在实现基于 redis 的分布式锁释放锁的时候或者下面要介绍的实现CAS 操作的,要执行多个操作但是希望操作是原子操作的时候就可以借助 Lua 脚本来实现(也可以使用事务来做) 基于 Redis Lua

C++注意

和自甴很熟 提交于 2020-03-07 18:30:58
断言 assert 是仅在 Debug 版本起作用的宏,它用于检查“不应该”发生的情况。 在函数的入口处,使用断言检查参数的有效性(合法性)。 如果程序在 assert 处终止了,并不是说含有该 assert 的函数有错误,而是调用者出了差错, assert 可以帮助我们找到发生错误的原因。 void *memcpy(void *pvTo, const void *pvFrom, size_t size) { assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言 byte *pbTo = (byte *) pvTo; // 防止改变pvTo的地址 byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom的地址 while(size -- > 0 ) *pbTo ++ = *pbFrom ++ ; return pvTo; } 来源: https://www.cnblogs.com/jiese/p/3204139.html

junit5中Assertions替代了Assert

若如初见. 提交于 2020-03-06 10:24:14
最近基于Spring Boot2.x版本中的JUnit5进行单元测试,发现Assert类已经不存在了,在JUnit5中使用Assertions进行替代。而且Junit5不仅仅替代了这么一个类,还有其他大量的类被重新定义和替换,在使用的时候大家需要留意。 同时Assertions中也提供了更多的方法,相关源码实现如下: @ API ( status = Status . STABLE , since = "5.0" ) public class Assertions { @ API ( status = Status . STABLE , since = "5.3" ) protected Assertions ( ) { } public static < V > V fail ( ) { AssertionUtils . fail ( ) ; return null ; } public static < V > V fail ( String message ) { AssertionUtils . fail ( message ) ; return null ; } public static < V > V fail ( String message , Throwable cause ) { AssertionUtils . fail ( message , cause

C++11 静态断言(static_assert)

喜欢而已 提交于 2020-03-05 15:23:18
简介 C++0x中引入了 static_assert 这个关键字,用来做编译期间的断言,因此叫做静态断言。 其语法很简单: static_assert (常量表达式,提示字符串)。 如果第一个参数常量表达式的值为真(true或者非零值),那么 static_assert 不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该 static_assert 语句所在行,错误提示就是第二个参数提示字符串。 说明 使用 static_assert ,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。 static_assert 可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。 编译器在遇到一个 static_assert 语句时,通常立刻将其第一个参数作为常量表达式进行演算,但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能。 由于之前有望加入C++0x标准的 concepts 提案最终被否决了,因此对于检查模板参数是否符合期望的重任,就要靠 static_assert 来完成了,所以如何构造适当的常量表达式,将是一个值得探讨的话题。 性能方面,由于是 static_assert 编译期间断言,不生成目标代码,因此