[英]How to undo “assert” in 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)
断言不应该用于实现某些代码的逻辑。 为什么? 因为你无法保证他们真的被提升了!
$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
属性访问使其失败的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
调用它,在这种情况下不会引发异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.