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

你是程序员吗? 如果是这样,无论您使用何种语言编写代码,调试都是一项基本技能。在本文中,您将学习如何在 Python 中使用断言语句进行有效调试。

当您处理一个项目时,您将定义多个模块。 这包括函数、类定义等。 由于实施中的错误,您可能会遇到错误或意外结果。 断言语句有助于调试此类代码。

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

让我们开始!

如何在 Python 中使用 Assert 语句

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

断言语句的语法

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

assert expression, message

这里,

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

接下来,让我们继续编写几个示例,其中 assert 语句可以帮助我们编写更清晰且无错误的代码。

您可以在此 GitHub 要点中找到本教程中使用的代码示例。

Python 的 Assert 语句示例

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

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

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

此处,discount (20) 小于 max_discount (50)。 所以 assert 语句不会抛出任何错误。

  如何从 Google Drive 中恢复已删除的 Google Doc

断言错误异常

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

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

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

我们还使用一个消息字符串来提供更具描述性的诊断信息。 在 assert 语句中,我们添加一个 Python f 字符串,其中还包含 discount 和 max_discount 的值。

>>> 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 异常现在包括 discount 和 max_discount 变量的值。

使用 Assert 调试和测试 Python 函数

在定义函数时,您有时可能会不经意地引入错误(逻辑错误),这些错误会阻止您的函数按预期工作。

让我们举个例子。 假设课堂上有一个测试,学生们有机会尝试一道附加题。 任何尝试附加题的学生都将在测试中获得 10 分的额外分数。 😄

考虑以下函数 get_final_score:

  • 它接受当前分数、分数和布尔值。
  • 如果学生回答了奖励问题,则布尔奖励为 True,他们将比当前分数多获得 10 分。
  • 该函数然后返回最终分数。
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

让我们对该函数进行几次调用。 我们看到,对于 34 分和 40 分且奖金设置为 True 和 False 的分数,最终分数分别为 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

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

  11 个适合企业和个人使用的最佳文本到语音解决方案

因此,让我们初始化一个 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 <module>
    assert final_score <= max_score
AssertionError

现在我们向 Python assert 语句添加一个描述性的 f 字符串:

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 <module>
    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。
  • 否则,我们返回分数。
  CTFU 是什么意思以及何时使用它?

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

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

作为一个快速练习,编写一些断言以确认函数现在按预期工作。

关于 AssertionError 异常的注释

虽然当表达式计算为 False 时会发生 AssertionError 异常,但我们应该记住不要将此类错误作为异常处理。 这意味着我们不应该这样做:

try:
    <doing this>
except AssertionError:
    <do this>

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

这就是断言的用途。 它们是代码的健全性检查,有助于编写更清晰的代码。 另一方面,异常处理是在运行时预测和处理意外错误。 这些通常包括无效的输入类型和值。

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

结论

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

  • Python 断言语句(断言)采用断言表达式的形式。 这将检查表达式是否为真。 如果它的计算结果不是 True,则会引发 AssertionError 异常。
  • 您还可以使用带有语法 assert expression, message 的断言。 每当发生 AssertionError 异常时,这将打印出消息字符串。
  • 您应该记住不要实施异常处理来处理断言错误。 并将断言用作有用的调试工具来检查代码的完整性。

作为开发人员,断言可以帮助您进行调试。 为确保项目的所有单独组件(模块)按预期工作,您可以学习如何使用 Python 编写单元测试。

接下来,查看您可以处理的初学者 Python 项目列表。