在Python中使用“assert”有什么用?

What is the use of “assert” in Python?

我读过一些源代码,在一些地方我看到了assert的用法。

这到底是什么意思?它的用法是什么?


assert语句几乎存在于每种编程语言中。它有助于在程序的早期发现问题,原因是清楚的,而不是后来作为一些其他操作的副作用。

当你做…

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!"

不要用括号像函数一样调用assert。这是一个声明。如果执行assert(condition, message)操作,则运行assert,其中(condition, message)元组作为第一个参数。

至于禁用它们,在优化模式下运行python时,其中__debug__False时,断言语句将被忽略。只要通过-O标志:

1
python -O script.py

有关文档,请参见此处。


在parentheses提防。已结账的尖上3,在Python的语句,assert仍然是操作系统相似,由一个具有相同的extrapolate print(..)梅,但你不应该对raise(..)assert(..)或T。

这是重要的,因为:

1
assert(2 + 2 == 5,"Houston we've got a problem")

不会工作的,不同的

1
assert 2 + 2 == 5,"Houston we've got a problem"

第一个原因是,将不工作的bool( (False,"Houston we've got a problem") )Trueevaluates)。

assert(False)这些语句,只是在redundant parentheses False,这对他们的内容进行了评价。但现在的parentheses与assert(False,)元组,元组和非空evaluates到True布尔上下文中。


正如其他答案所指出的,assert类似于在给定条件不正确时抛出异常。一个重要的区别是,如果使用优化选项编译代码,那么断言语句将被忽略。文件说,可以更好地将assert expression描述为等同于

1
2
if __debug__:
   if not expression: raise AssertionError

如果你想彻底测试你的代码,然后在你很高兴没有一个断言失败的时候发布一个优化的版本,这是很有用的——当优化打开时,__debug__变量变为假,条件将停止评估。如果您依赖于断言,并且没有意识到它们已经消失,那么这个特性也可以将您排除在外。


其他人已经为您提供了指向文档的链接。

您可以在交互式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语句有两种形式。

简单形式assert 相当于

1
2
if __?debug__:
    if not <expression>: raise AssertionError

扩展形式assert , 相当于

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')

$python b.py时的结果

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.

你可以使用一个assert语句理解到你的代码的文件,在特定的程序点。例如,假设你可以为文件或程序(先决条件),在输入状态(不变量),或输出(后置条件)。

你不应该assertion失败,这是一种警戒你(或你的继承人),你的程序是错误的理解,当你写它,这可能包含一个虫子。

蛛网膜下腔出血(SAH)的更多信息,约翰Regehr美好的博客在线使用assertions,这适用于在assert以及Python语句。


如果你曾经想知道是什么让Python中的保留功能,在help(enter_keyword)

确保如果你进入你的关键字是保留它的输入字符串。


我的解释是:短

  • 如果表达的是一AssertionErrorassert提出假,不只是你的代码,如果有一个逗号将它它也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断言是错误的,它帮助开发人员确定有什么不可能发生的。

希望它帮助。


assert语句几乎存在于每种编程语言中。它有助于在程序的早期发现问题,原因是清楚的,而不是后来作为一些其他操作的副作用。他们总是期望有一个True条件。

当你做如下事情时:

1
assert condition

您要告诉程序测试该条件,如果该条件为假,则立即触发错误。

在python中,assert表达式等价于:

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

在主要用于那些认为在assertif声明之间切换的人之前,需要注意一些注意事项。使用assert的目的是在程序验证某个条件并返回一个值时,该值应立即停止程序,而不是采取其他方法绕过错误:

1。圆括号

正如您可能注意到的,assert语句使用两个条件。因此,不要使用括号将它们作为一个明显的建议。如果您这样做:

1
assert (condition, message)

例子:

1
2
>>> assert (1==2, 1==1)
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?

您将运行assert,其中(condition, message)表示一个元组作为第一个参数,这会导致python中的非空元组始终是True。但是,您可以单独执行,而不会出现问题:

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。调试目的

如果您想知道何时使用assert语句。以现实生活中使用的例子为例:

*当程序倾向于控制用户输入的每个参数或其他参数时:

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

三。数据处理或数据验证

最重要的是不要依赖assert语句来执行数据处理或数据验证,因为该语句可以在用-O-OO标志(分别表示值1、2和0(默认值)或PYTHONOPTIMIZE环境变量进行python初始化时关闭。

值1:

*断言被禁用;

*字节码文件是使用.pyo扩展名而不是.pyc扩展名生成的;

*sys.flags.optimize设为1(True)。

*将__debug__设置为False

值2:禁用另一个内容

*文档字符串被禁用;

因此,使用assert语句来验证一种预期的数据是非常危险的,这甚至意味着一些安全问题。那么,如果您需要验证一些许可,我建议您使用raise AuthError。作为一种前提条件,assert通常由程序员在没有用户直接交互的库或模块上使用。


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