Python中的“断言”有什么用?
我一直在阅读一些源代码,并在几个地方看到assert
的用法。
这到底意味着什么? 它的用法是什么?
assert
语句几乎存在于每种编程语言中。 当你做…
assert condition
…你告诉程序testing这个条件,如果条件是错误的,会触发一个错误。
在Python中,它大致相当于这个:
if not condition: raise AssertionError()
在Python shell中尝试:
>>> assert True # nothing happens >>> assert False Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError
断言可以包含一个可选的消息,当你完成debugging时,你可以禁用它们。 在这里查看相关文件。
小心括号。 正如前面已经指出的那样, 在Python 3中, assert
仍然是一个声明 ,所以通过类比print(..)
,可以推断相同的assert(..)
或raise(..)
但你不应该这样做。
这很重要,因为:
assert(2 + 2 == 5, "Houston we've got a problem")
不会工作,不像
assert 2 + 2 == 5, "Houston we've got a problem"
第一个不行的原因是bool( (False, "Houston we've got a problem") )
评估为True
。
在声明assert(False)
,这些只是False
周围的冗余括号,根据其内容进行评估。 但是用assert(False,)
,圆括号现在是一个元组,而一个非空元组在一个布尔上下文中求值为True
。
正如其他答案已经指出, assert
是类似于抛出一个例外,如果一个给定的条件是不正确的。 一个重要的区别是,如果使用优化选项编译代码,assert语句会被忽略。 文档中说assert expression
可以更好地描述为相当于
if __debug__: if not expression: raise AssertionError
如果你想彻底地testing你的代码,然后发布一个优化的版本,那么当你感到高兴时,你的断言情况都不会失败 – 当优化开始时, __debug__
variables变为False,条件将停止评估。 如果你依赖断言,这个function也可以把你赶出去,而不会意识到它们已经消失了。
其他人已经给你链接到文档。
您可以在交互式shell中尝试以下操作:
>>> assert 5 > 2 >>> assert 2 > 5 Traceback (most recent call last): File "<string>", line 1, in <fragment> builtins.AssertionError:
第一个陈述什么都不做,而第二个陈述则是一个例外。 这是第一个提示:断言有助于检查代码的给定位置(通常是开始(前提条件)和函数结尾(后置条件))中应该为真的条件。
断言实际上与通过契约进行编程高度相关,这是一个非常有用的工程实践:
assert语句有两种forms。
assert <expression>
的简单forms等同于
if __debug__: if not <expression>: raise AssertionError
扩展formsassert <expression1>, <expression2>
相当于
if __debug__: if not <expression1>: raise AssertionError, <expression2>
断言是一种系统的方法来检查程序的内部状态是否像程序员期望的那样,其目的是捕捉错误。 看下面的例子。
>>> 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! >>>
Python中断言的目的是告诉开发者程序中不可恢复的错误。
断言不是用来表示预期的错误条件,如“找不到文件”,用户可以采取纠正措施(或再次尝试)。
另一种看待它的方法是断言是你的代码中的内部自我检查 。 他们通过在代码中声明一些条件是不可能的。 如果这些条件不成立,就意味着程序中存在一个错误。
如果你的程序没有bug,这些条件将永远不会发生。 但是,如果其中一个确实发生,程序将会崩溃,断言错误告诉你究竟触发了哪个“不可能的”条件。 这样可以更轻松地追踪和修复程序中的错误。
下面是关于我写的Python断言教程的总结:
Python的断言语句是一种debugging帮助,而不是处理运行时错误的机制。 使用断言的目的是让开发人员更快地find可能的错误根源。 除非程序中有错误,否则绝不应该提出断言错误。
从文档:
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)
def chkassert(num): assert type(num) == int chkassert('a')
和$python b.py
的结果
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
如果你想知道python中保留的函数是什么,请inputhelp(enter_keyword)
确保您input的是以stringformsinput的保留关键字。
如果assert之后的语句为true,那么程序继续,但是如果assert之后的语句是false,那么程序会给出一个错误。 就那么简单。
例如:
assert 1>0 #normal execution assert 0>1 #Traceback (most recent call last): #File "<pyshell#11>", line 1, in <module> #assert 0>1 #AssertionError
def getUser(self, id, Email): user_key = id and id or Email assert user_key
可以用来确保参数在函数调用中传递。
格式:assert Expression [,arguments]当assert遇到语句时,Python计算expression式。如果语句不是true,则会引发exception(assertionError)。 如果断言失败,Python将使用ArgumentExpression作为AssertionError的参数。 AssertionErrorexception可以像使用try-except语句的任何其他exception一样捕获和处理,但是如果不处理,它们将终止程序并产生回溯。 例:
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)
当上面的代码被执行时,它会产生以下结果:
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!
快速切入“断言”。
assert
作为一个检查点执行,
如果运作良好,继续;
否则发出警报。
>>>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
a=5 b=6 assert a==b
OUTPUT:
assert a==b AssertionError
代码-2-
a=5 b=5 assert a==b
OUTPUT:
Process finished with exit code 0