使用Python断言语句进行有效调试

你是一个程序员吗?如果是的话,无论你使用哪种编程语言,调试都是一项必不可少的技能。在本文中,你将学习如何在Python中使用断言语句进行有效的调试。

当你在项目中工作时,你将定义多个模块。这包括函数、类定义等。由于实现中的错误,你可能会遇到错误或意外的结果。断言语句对于调试这样的代码非常有帮助。

在本教程中,我们将学习使用断言语句的语法,然后通过代码示例来看它的实际应用。我们还将看到断言错误是什么,以及在开发过程中如何使用它们来修复代码中的错误。

让我们开始吧!

如何在Python中使用断言语句

我们将学习使用断言语句的语法,然后继续编写一些示例代码。

断言语句的语法

让我们从在Python中使用断言语句的语法开始:

assert expression, message

这里,

  • expression 是任何有效的Python表达式。它可以是变量的条件、变量的真值、函数的返回值等。
  • 只要expression求值为True,断言语句就不会抛出错误或返回任何内容。这表示程序按预期工作。
  • 如果expression不再是True,则会引发AssertionError异常。
  • message 是一个可选的字符串。你可以指定一条消息,每当引发AssertionError异常时,该消息将显示在回溯中。

接下来,让我们继续编写一些示例代码,看看断言语句如何帮助我们编写更清晰和无错误的代码。

你可以在this GitHub gist中找到本教程中使用的代码示例。

Python的断言语句示例

考虑以下示例。假设你的代码中有一个discount变量。但你希望它的值始终小于或等于max_discount

为了检查你是否不小心将discount变量设置为一个值,你可以添加一个断言。要评估的表达式是:discount <= max_discount

>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount

这里,discount(20)小于max_discount(50)。所以断言语句不会抛出任何错误。

AssertionError异常

如果discount变量设置为大于max_discount的值,则会引发AssertionError异常。

>>> discount = 75
>>> assert discount <= max_discount
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

我们知道断言语句也允许我们指定一个可选的消息字符串。

让我们还使用一个包含discountmax_discount值的更具描述性的诊断信息的消息字符串。在断言语句中,我们添加一个Python f-string。

>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: discount should be at most 50; got discount = 75

如上输出单元中所示,AssertionError异常现在包括了discountmax_discount变量的值。

使用断言调试和测试Python函数

在定义函数时,有时会无意中引入错误(逻辑错误),这将阻止函数按预期工作。

让我们来看一个例子。假设一个班级中有一道考试题,学生有机会尝试一个额外的问题。任何尝试额外问题的学生都将在考试中获得额外的10分。😄

考虑以下函数get_final_score

  • 它接收当前分数score和一个布尔值bonus
  • 如果学生回答了额外问题,布尔值bonusTrue,他们的当前分数将增加10分。
  • 然后函数返回最终分数。
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

让我们对这个函数进行几次调用。我们可以看到,对于分数为34和40,且bonus分别设置为TrueFalse的情况,最终分数分别为44和40。

print(get_final_score(34,True))
# 44
print(get_final_score(40,False))
# 40

然而,考试的最高分是50。所以如果一个学生得分为49,并回答了额外问题,函数get_final_score将高兴地计算最终得分为59。

print(get_final_score(49,True))
# 59

从技术上讲,这是可能的。但是让我们假设一个学生不能得到超过考试可能的最高分。🙂

所以让我们初始化一个max_score变量,并将函数返回的分数保存在final_score变量中。

然后,我们添加一个断言,检查final_score是否小于max_score

def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

final_score = get_final_score(47,True)
max_score = 50

assert final_score <= max_score

现在,对于函数调用get_final_score(47,True),我们得到了一个AssertionError异常:

Traceback (most recent call last):
  File "main.py", line 17, in 
    assert final_score <= max_score
AssertionError

现在我们在Python断言语句中添加了一个描述性的f-string:

assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last):
  File "main.py", line 17, in 
    assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
AssertionError: final_score should be at most 50; got 57

修改函数

让我们回过头来修改get_final_score函数的定义,以修复意外的行为:

  • 函数get_final_score还接收max_score作为参数。
  • 我们检查bonus是否为True。如果为True,我们将10分加到分数变量上。
  • 然后,我们检查score是否大于max_score。如果是,则返回max_score
  • 否则,返回score

现在,我们确保最终分数始终小于或等于max_score

作为一个快速的练习,写几个断言来确认函数现在按预期工作。

关于AssertionError异常的说明

虽然当表达式求值为False时会发生AssertionError异常,但我们应该记住不要处理这种错误,这意味着我们不应该这样做:

try:
    
except AssertionError:
    

在前面关于get_final_score的示例中,我们使用断言来检查final_score是否小于max_score。然后,我们修改了函数定义以确保没有断言错误。

这就是断言的作用。它们是用来检查代码的正确性,并有助于编写更清晰的代码。而异常处理则是为了预见和处理运行时的意外错误,这些错误通常包括无效的输入类型和值。

总而言之,你应该使用Python的assert语句进行有效的调试,而不是将AssertionError作为异常处理。

结论

本教程帮助你理解如何在Python中使用assert语句。以下是你学到的内容的总结:

  • Python的assert语句(断言)的形式为assert expression。它检查expression是否为True。如果它的求值结果不为True,则会引发一个AssertionError异常。
  • 你还可以使用带有语法assert expression, message的assert语句。这将在发生AssertionError异常时打印出message字符串。
  • 你应该记住不要使用异常处理来处理断言错误。使用断言作为帮助调试工具,对代码进行健全性检查。

作为一个开发者,断言有助于你进行调试。为了确保项目的各个单独组件(模块)按预期工作,你可以学习如何编写assert statements

接下来,查看一下你可以参与的tasks列表

类似文章