如何在python中撤消“assert”?

2024-04-26 09:35:55 发布

您现在位置:Python中文网/ 问答频道 /正文

在早期的函数中,我们称之为a,我必须确保a函数不会产生太小的答案(比如说,答案必须大于10)。 但是稍后,在第二个函数b(它使用函数a作为它的输入之一)中,如果被修改的同一个答案比前面的assert语句小,那就没问题了。你知道吗

有办法吗?你知道吗

当函数b生成的答案太小时,我试图保存变量中的答案有多小,但在运行doctest时仍然会出现断言错误。你知道吗

def grade_on_project(student_project_score, max_score, overall_score):
    project_grade = student_project_score / max_project_score
    assert project_grade > 0.6 # (student fails the class if any of their scores on a project are too low)
    overall_score +=student_project_score
    return overall_score

def who_fails_first(operation, person1, person2)
    if (operation(person1, max_score, person1) <= 150 and (operation(person2, max_score, overall_score) > 150:
        print(student 1 failed)
    if (operation(person2, max_score, overall_score) <= 150 and (operation(person1, max_score, overall_score) > 150:
        print(student 2 failed)

 who_fails_first(grade_on_project, 5, 9)

Tags: 函数答案projectifonassertoperationstudent
1条回答
网友
1楼 · 发布于 2024-04-26 09:35:55

断言应该而不是用于实现某段代码的逻辑。为什么?因为你不能保证他们真的长大了!你知道吗

$python -c 'assert False'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError
$python -O -c 'assert False'   # doesn't raise an error!
$

-O选项用于“优化”。但它也会删除所有断言

assert应用于调试,检查编写良好的程序中不应发生的情况。你知道吗

如果要以某种方式处理特殊输入,应使用异常

def grade_on_project(student_project_score, max_score, overall_score):
    project_grade = student_project_score / max_project_score

    if project_grade > 0.6:
        raise ValueError('Student fails if at least one project grade is too low.')

    overall_score +=student_project_score
    return overall_score

或者您可以编写一个自定义异常,如:

class StudentFailed(ValueError):
    def __init__(self, message, grade):
        super(StudentFailed, self).__init__(message)
        self.grade = grade

并将if更改为:

if project_grade > 0.6:
    raise StudentFailed('One project has grade too low.', project_grade)

然后,当您捕获异常时,仍然可以通过异常的grade属性访问导致它失败的等级。你知道吗

如果不想在特定情况下引发异常,可以添加一个参数,例如low_grade_is_ok,并将函数修改为:

def grade_on_project(student_project_score, max_score,
                     overall_score, low_grade_is_ok=False):
    project_grade = student_project_score / max_project_score

    if not low_grade_is_ok and project_grade > 0.6:
        raise ValueError('Student fails if at least one project grade is too low.')

    overall_score +=student_project_score
    return overall_score

然后在不希望引发异常的函数中,可以使用low_grade_is_ok=True调用它,在这种情况下不会引发异常。你知道吗

相关问题 更多 >