Python 中的assert语句

原文:https://www.studytonight.com/python/python-assert

在编程中,断言用于验证指定条件是否为真。例如,如果我们有一个函数将两个数字相加,在使用+运算符将用户提供的两个数字相加之前,我们可以使用一个断言来检查输入的值是否只是数字,而不是字母或特殊字符。

Assert 语句包含一个布尔表达式,用于检查条件的真实性,如果发现有效,则返回 true,否则返回 false。

当在程序中使用断言时,在肯定断言的情况下,程序将继续正常执行,而在否定断言的情况下,程序将停止执行并抛出一个错误。


Python assert语句

在 python 中,有一个内置的 assert 语句,可以用来在程序中实现断言。python 中的 assert 语句将一个条件或表达式作为参数,并期望它为真,以便程序继续执行。如果条件/表达式为假,assert 语句将抛出一个 AssertionError ,从而中断程序的正常执行。

python 中的断言是将条件应用于验证的 python 方式,通常使用if...else条件。

让我们举一个简单的例子来理解何时何地使用 assert 语句。如果您有一个程序将用户输入的密码作为输入,则应检查输入是否为强密码,如果发现强密码,则应存储该密码,否则应要求用户重新输入密码。在这种情况下,我们可以使用 assert 语句对输入的密码值应用各种条件,以检查它是否是强密码。如果条件返回真,那么程序将继续存储密码,否则assert语句将抛出断言错误。有道理!

assert语句的语法:

Assert 语句可以通过两种方式声明:

assert <condition>
# with condition and error message
assert <condition>, <error message>

在第一种语法中,assert 语句将只检查条件,当条件为 false 时,它将引发断言错误。但是在第二种情况下,当条件为假时,assert 语句还将打印一条消息以及断言错误。


时间为例!

让我们举一个简单的例子,我们将定义一个函数来查找分数百分比,其中将提供一个满分为 100 分的分数列表。我们将使用 assert 语句来确保列表中没有包含负号的标记条目。

正如您在上面的程序中看到的,当我们提供 1 个负值时,程序失败并显示 AssertionError ,否则它会成功执行并返回结果。

现在,让我们更新上面的程序,在 assert 语句中包含一条与断言错误一起显示的消息。

# function to calculate percentage, given a list of marks out of 100
def percentage(marks):
  for m in marks:
    # marks should always be a positive value
    assert m > 0, "Only positive values allowed"
  return (sum(marks)/len(marks))

print(percentage([90,93,99,95,-94]))

回溯(最近一次调用最后一次):File "/tmp/sessions/2ce 06 e6f 313 b 60 F6/main . py ",第 8 行,在打印中(百分比([90,93,99,95,-94])" File "/tmp/sessions/2ce 06 e6f 313 b 60 F6/main . py ",第 5 行,在百分比断言 m > 0 中,"只允许正值" AssertionError:只允许正值


一些要记住的要点!

断言不同于尝试...除了。尝试...except 用于处理可恢复的错误,随后可以采取纠正措施,而 assert 语句用于处理无法恢复或不需要任何纠正措施的错误。

Assert 是一个语句而不是函数,因此千万不要用括号括起来。如果您试图执行下面的assert(condition, message),assert 将以一个元组作为第一个参数来执行。它将把(condition, message)作为元组输入。

assert 语句的行为类似于下面的代码:

if not condition:
    raise AssertionError()

虽然不完全是这样,但更多的还是这样的表现。

如果您有一个包含许多assert语句的程序,并且您想要禁用所有assert语句,请在优化模式下运行 python 脚本,这可以使用-o标志来完成。

python -o yourscript.py

因为在优化模式下__debug__,根据 python 的官方文档,assert 语句相当于:

if __debug__:
   if not expression: raise AssertionError

因此,如果__debug__为假,assert语句被禁用。