What is the use of “assert” in Python?
我读过一些源代码,在一些地方我看到了
这到底是什么意思?它的用法是什么?
当你做…
1 | assert condition |
…您告诉程序测试该条件,如果条件为假,则立即触发错误。
在python中,它大致相当于:
1 2 | if not condition: raise AssertionError() |
在python shell中进行尝试:
1 2 3 4 5 | >>> assert True # nothing happens >>> assert False Traceback (most recent call last): File"<stdin>", line 1, in <module> AssertionError |
断言可以包含可选消息,并且可以在运行解释器时禁用它们。
如果断言失败,则打印消息:
1 | assert False,"Oh no! This assertion failed!" |
不要用括号像函数一样调用
至于禁用它们,在优化模式下运行
1 | python -O script.py |
有关文档,请参见此处。
在parentheses提防。已结账的尖上3,在Python的语句,
这是重要的,因为:
1 | assert(2 + 2 == 5,"Houston we've got a problem") |
不会工作的,不同的
1 | assert 2 + 2 == 5,"Houston we've got a problem" |
第一个原因是,将不工作的
在
正如其他答案所指出的,
1 2 | if __debug__: if not expression: raise AssertionError |
如果你想彻底测试你的代码,然后在你很高兴没有一个断言失败的时候发布一个优化的版本,这是很有用的——当优化打开时,
其他人已经为您提供了指向文档的链接。
您可以在交互式shell中尝试以下操作:
1 2 3 4 5 | >>> assert 5 > 2 >>> assert 2 > 5 Traceback (most recent call last): File"<string>", line 1, in <fragment> builtins.AssertionError: |
第一条语句什么也不做,而第二条语句则引发异常。这是第一个提示:断言对于检查在代码的给定位置(通常是函数的开始(前置条件)和结束(后置条件))应为真的条件非常有用。
断言实际上与契约编程密切相关,这是一种非常有用的工程实践:
http://en.wikipedia.org/wiki/design_by_合同。
在Python中的一个目标是assertion通知开发商unrecoverable中关于错误的程序。
assertions是不预期的错误条件的信号的目的,如"文件未找到"的用户,可以在纠正行动(或只是要再试一次。
另一种方式来看看它是assertions是说在你的内部自我检查代码。他们的工作条件,通过declaring一些不可能在你的代码。如果这些条件不保持这样的均值有bug的程序。
如果你的程序是无缺陷的,这些条件将不会发生。如果一个程序不发生碰撞,他们会告诉你assertion带有一个误差项的条件是"不可能"的触发。这使得它更容易跟踪和多向下修正你的计划。
这是总结从Python教程,在线的assertions i写道:
Python’s assert statement is a debugging aid, not a mechanism for handling run-time errors. The goal of using assertions is to let developers find the likely root cause of a bug more quickly. An assertion error should never be raised unless there’s a bug in your program.
assert语句有两种形式。
简单形式
1 2 | if __?debug__: if not <expression>: raise AssertionError |
扩展形式
1 2 | if __?debug__: if not <expression1>: raise AssertionError, <expression2> |
断言是检查程序内部状态是否如程序员所期望的那样的一种系统方法,其目的是捕获错误。请参见下面的示例。
1 2 3 4 5 6 7 | >>> number = input('Enter a positive number:') Enter a positive number:-1 >>> assert (number > 0), 'Only positive numbers are allowed!' Traceback (most recent call last): File"<stdin>", line 1, in <module> AssertionError: Only positive numbers are allowed! >>> |
来自DOCS:
1 | Assert statements are a convenient way to insert debugging assertions into a program |
您可以在这里阅读更多:http://docs.python.org/release/2.5.2/ref/assert.html
下面是一个简单的示例,将其保存在文件中(比如b.py)
1 2 3 4 5 | def chkassert(num): assert type(num) == int chkassert('a') |
当
1 2 3 4 5 6 | Traceback (most recent call last): File"b.py", line 5, in <module> chkassert('a') File"b.py", line 2, in chkassert assert type(num) == int AssertionError |
如果assert后的语句为true,则程序继续,但如果assert后的语句为false,则程序给出错误。很简单。
例如。:
1 2 3 4 5 | assert 1>0 #normal execution assert 0>1 #Traceback (most recent call last): #File"<pyshell#11>", line 1, in <module> #assert 0>1 #AssertionError |
在C2的summarized concisely维基
An assertion is a boolean expression at a specific point in a program which will be true unless there is a bug in the program.
你可以使用一个
你不应该assertion失败,这是一种警戒你(或你的继承人),你的程序是错误的理解,当你写它,这可能包含一个虫子。
蛛网膜下腔出血(SAH)的更多信息,约翰Regehr美好的博客在线使用assertions,这适用于在
如果你曾经想知道是什么让Python中的保留功能,在
确保如果你进入你的关键字是保留它的输入字符串。
我的解释是:短
- 如果表达的是一
AssertionError assert 提出假,不只是你的代码,如果有一个逗号将它它也AssertionError: whatever after comma 、码raise AssertionError(whatever after comma) 样:
教程:关于此相关的
https://www.tutorialspoint.com/python/assertions_in_python.htm
Python是一个基本断言在调试援助下内部自检测试你的代码。当你真的很容易断言调试代码,使得不可能付诸实行的边缘案件。那些不可能的断言检查的病例。
让我们说有一个函数来计算项目的折扣后的价格。
1 2 3 4 | def calculate_discount(price, discount): discounted_price = price - [discount*price] assert 0 <= discounted_price <= price return discounted_price |
在这里,_折扣价格不能是0和小于更大的比目前的价格。在上述条件下的操作系统实例,提出一assertion violated断言是错误的,它帮助开发人员确定有什么不可能发生的。
希望它帮助。
当你做如下事情时:
1 | assert condition |
您要告诉程序测试该条件,如果该条件为假,则立即触发错误。
在python中,
1 2 | if __debug__: if not <expression>: raise AssertionError |
可以使用扩展表达式传递可选消息:
1 2 | if __debug__: if not (expression_1): raise AssertionError(expression_2) |
在python解释器中进行尝试:
1 2 3 4 5 | >>> assert True # Nothing happens because the condition returns a True value. >>> assert False # A traceback is triggered because this evaluation did not yield an expected value. Traceback (most recent call last): File"<stdin>", line 1, in <module> AssertionError |
在主要用于那些认为在
正如您可能注意到的,
1 | assert (condition, message) |
例子:
1 2 | >>> assert (1==2, 1==1) <stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses? |
您将运行
1 | assert (condition),"message" |
例子:
1 2 3 4 | >>> assert (1==2), ("This condition returns a %s value.") %"False" Traceback (most recent call last): File"<stdin>", line 1, in <module> AssertionError: This condition returns a False value. |
2。调试目的
如果您想知道何时使用
*当程序倾向于控制用户输入的每个参数或其他参数时:
1 2 3 4 | def loremipsum(**kwargs): kwargs.pop('bar') # return 0 if"bar" isn't in parameter kwargs.setdefault('foo', type(self)) # returns `type(self)` value by default assert (len(kwargs) == 0),"unrecognized parameter passed in %s" % ', '.join(kwargs.keys()) |
*另一个例子是数学,当0或非正作为某个方程的系数或常数时:
1 2 3 4 5 6 7 8 | def discount(item, percent): price = int(item['price'] * (1.0 - percent)) print(price) assert (0 <= price <= item['price']),\ "Discounted prices cannot be lower than 0"\ "and they cannot be higher than the original price." return price |
*甚至是一个简单的布尔实现示例:
1 2 3 4 5 6 7 | def true(a, b): assert (a == b),"False" return 1 def false(a, b): assert (a != b),"True" return 0 |
三。数据处理或数据验证
最重要的是不要依赖
值1:
*断言被禁用;
*字节码文件是使用
*
*将
值2:禁用另一个内容
*文档字符串被禁用;
因此,使用
1 2 3 4 5 | def getUser(self, id, Email): user_key = id and id or Email assert user_key |
可用于确保在函数调用中传递参数。
格式:断言表达式[,参数]当assert遇到语句时,python计算表达式。如果该语句不是true,则会引发异常(assertionerror)。如果断言失败,Python将使用ArgumentExpression作为断言错误的参数。断言错误异常可以像使用try except语句的任何其他异常一样被捕获和处理,但如果不处理,它们将终止程序并产生一个回溯。例子:
1 2 3 4 5 6 | def KelvinToFahrenheit(Temperature): assert (Temperature >= 0),"Colder than absolute zero!" return ((Temperature-273)*1.8)+32 print KelvinToFahrenheit(273) print int(KelvinToFahrenheit(505.78)) print KelvinToFahrenheit(-5) |
执行上述代码时,会产生以下结果:
1 2 3 4 5 6 7 8 | 32.0 451 Traceback (most recent call last): File"test.py", line 9, in <module> print KelvinToFahrenheit(-5) File"test.py", line 4, in KelvinToFahrenheit assert (Temperature >= 0),"Colder than absolute zero!" AssertionError: Colder than absolute zero! |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | >>>this_is_very_complex_function_result = 9 >>>c = this_is_very_complex_function_result >>>test_us = (c < 4) >>> #first we try without assert >>>if test_us == True: print("YES! I am right!") else: print("I am Wrong, but the program still RUNS!") I am Wrong, but the program still RUNS! >>> #now we try with assert >>> assert test_us Traceback (most recent call last): File"<pyshell#52>", line 1, in <module> assert test_us AssertionError >>> |
基本的意思是,如果assert关键字状态是不真实的,然后它是通过其他assertionerror例如Python中的继续。
代码1
1 2 3 4 5 | a=5 b=6 assert a==b |
输出:
1 2 3 | assert a==b AssertionError |
代码2
1 2 3 4 5 | a=5 b=5 assert a==b |
输出:
1 | Process finished with exit code 0 |