理解Python中assert断言:原因、用法及调试意义
我认为,如何在Python中优雅地说明,许多不可宣扬的人是无助的。因此,本文总结了问题的原因和解决方案。通过本文,我希望您可以解决此问题。

什么是断言
断言语句是将调试主张插入程序中的便捷方法
主张声明是程序调试的便捷方法。它可以被视为调试工具。 Python的实施也符合这种设计理念。 The execution of the Assert statement in Python depends on the built -in variable __debug__, and its default value is True.当__debug__ true时,将执行断言语句。
对于一般语句,断言表达等同于
if __debug__: if not expression: raise AssertionError
断言还可以同时声明两个表达
if __debug__: if not expression1: raise AssertionError(expression2)
如果执行脚本文件时添加-O参数,则__debug__是false
例如,假设我们有一个脚本testAssert.py,内容为:
print(__debug__) assert 1 > 2
在使用Python surst.py运行时,__ debug__将输出true,断言1> 2的陈述将抛出一个essertionerror异常。
当使用Python -o assert.py运行时,__ debug__将输出false,断言1> 2句子不会报告任何异常,因为没有执行。
冒险和使用异常情况
让我们谈谈结论:
检查优先条件的冒险经历,检查后的情况异常
例如,为了解释在开发中,我们经常遇到阅读本地文件的场景。我们定义read_file方法。
def read_file(path): assert isinstance(file_path, str) ...
read_file函数要求在启动执行时符合某些条件:file_path必须是str类型,此条件是优先条件。如果不满足,则无法调用此功能。如果存在不符合条件的情况,则代码中发生了证明代码。此时,此时,我们可以使用断言语句来推断file_path的类型,以提醒程序员修改代码。您也可以使用...提高...声明来实现断言,但这更加乏味。在许多出色的Python项目中,您会看到主张用于优先判断,并且通常可以更加关注。
调用read_file函数后,它仍然需要满足某些条件,例如File_path指定的文件需要存在,并且当前用户有权读取文件。我们需要使用异常来处理。
def read_file(file_path): assert isinstance(file_path, str) if not check_exist(file_path): raise FileNotFoundError() if not has_privilege(file_path): raise PermissionError()
该文件不存在且没有权限。这两种情况不属于代码错误,这是代码逻辑的一部分。上述代码捕获异常后,可以执行其他逻辑。因此,我们不能接受代码的这一部分。测试条件后。此外,与断言语句相比,只能抛出任何essertionerror,可以使用异常抛出更详细的错误,这对于上代码可以方便地执行不同错误的逻辑。
使用主张的原则
使用断言捕获不应发生的非法情况。不要混淆非法情况和错误之间的区别,后者必须存在并且必须处理。
使用断言确认函数的参数。
编写功能时,您需要进行重复的考试,然后问自己:“我打算做什么假设?”确定假设后,使用断言检查假设。
通常,教科书鼓励程序员设计反越野抗性程序,但请记住,这种编程风格会隐藏错误。当处理反编程时,如果确实发生了“不可能”,则使用断言来报警。
它也可以用于代码测试,该代码测试用作做事的开发人员的单元测试。只要您使用-O标志时可以接受测试。我有时会在代码中使用“断言Fasle”来标记尚未实现的分支。当然,我希望他们失败。如果它稍微详细,它可能会触发notimplemendederor,这是一个更好的选择
良好使用的另一个断言是检查程序中的不变变量。除非缺陷使其成为假的,否则您可以相信它。如果存在缺陷,越早越早,越好,因此我们需要对其进行测试,但是由于这些测试,我们不想影响代码执行速度。因此,当使用断言时,它可能在开发中生效并在产品中失败。
断言也是一个很好的检查点注释。替换以下评论:
#当我们执行到这里,我们知道n>2 #你可以确保在运行时用以下断言: assert n > 2
建议不要使用断言:
阅读上述内容后,您是否掌握了使用Python中主张优雅的方法?如果您仍然想学习更多技能或想了解更多相关的内容,请欢迎注意Yixuyun行业信息渠道,请感谢您的阅读!