断言是什么意思?它是如何使用的?


当前回答

>>>this_is_very_complex_function_result = 9
>>>c = this_is_very_complex_function_result
>>>test_us = (c < 4)

>>> #first we try without assert
>>>if test_us == True:
    print("YES! I am right!")
else:
    print("I am Wrong, but the program still RUNS!")

I am Wrong, but the program still RUNS!


>>> #now we try with assert
>>> assert test_us
Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    assert test_us
AssertionError
>>> 

其他回答

def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

可用于确保在函数调用中传递参数。

assert语句有两种形式。

简单形式assert <expression>相当于

if __​debug__:
    if not <expression>: raise AssertionError

扩展形式assert <expression1>, <expression2>等价于

if __​debug__:
    if not <expression1>: raise AssertionError(<expression2>)

断言是什么意思?它是如何使用的?

这里有很好的答案,但不是问题的第二部分。尽管有多年的实践经验,但我直到最近才明白断言的目的。

其他人已经解释了如何使用assert,所以我非常简短。下面是它的用法:

assert condition, "error message"

不要使用圆括号,assert是关键字,不是函数。

assert (condition, "error message")  # wrong: this never fails!

这里给出了如何使用assert的一个很好的解释:http://wiki.c2.com/?WhatAreAssertions assert的目的是在代码中声明不变量。不变式是一种永远不应该违反的条件,除非代码中存在错误。把它们看作是可执行的文档。这与面向对象编程如何封装来自外部世界的代码密切相关。

简单地说:对于其他开发人员,您应该在代码中像使用注释一样使用断言。但它比注释要好,“注释”实际上是在调试模式下检查的!如果删除断言后,您的程序不能正常工作,那么您使用错误。事实上,如果你打开优化(Python -O), Python将忽略所有的断言。所以不要依赖他们。特别是,不要使用断言来验证用户输入。而是引发异常。

这里有一个很好的例子来把它们联系在一起。让我们假设您希望在代码中有一个特殊的数字类,它表示称为PositiveInt的正整数。你为什么想要那个?有许多函数使用正整数作为参数。通过在代码中使用PositiveInt,您不必在每个函数中反复检查输入是否有效。它由PositiveInt保证。粗略的实现如下所示

class PositiveInt(int):
    # int is immutable, so we have to override new and not init
    def __new__(cls, value):
        if value <= 0:
            raise ValueError(f"{value} is not positive")
        assert value > 0, "value must be positive"
        return super(PositiveInt, cls).__new__(cls, value)   

如你所见,我用了两个if…:提高……用于输入验证和函数末尾的断言。这似乎是多余的,但仅在这个微不足道的示例中!假设函数稍微长一些,也更复杂一些,因此您是否正确地验证了输入并不明显。末尾的断言确保检测到验证代码中的错误。它还使另一个程序员更清楚地了解验证代码的意图,而不是简单的注释。

总之:像使用注释一样使用assert。到处使用!它很便宜,如果它成为用户的性能问题,你可以在发行版中使用python -O关闭它。

如果assert关键字后面的代码为False, Python中的assert关键字将引发AssertionError。如果没有,它继续什么都没有发生。

示例1:

a = 5
b = 6

assert a == b

输出:

AssertionError

这是因为,很明显,a不等于b。 如果你想在代码中引发一个异常,这是特别有用的。

def get_dict_key(d, k):
    try:
        assert k in d
        return d[k]
    except Exception:
        print("Key must be in dict.")

上面的示例实际上是无用的,但是请记住,它主要用于调试目的,因此您可以跟踪错误。

assert语句几乎存在于每一种编程语言中。它有两个主要用途:

它有助于在程序的早期(原因很清楚的时候)检测问题,而不是在其他一些操作失败的时候。例如,Python中的类型错误如果没有在早期被捕获,可能会在实际引发异常之前经历几层代码。 对于阅读代码的其他开发人员来说,它可以作为文档使用,他们看到断言后可以自信地说从现在开始它的条件是成立的。

当你……

assert condition

... 您告诉程序测试该条件,如果条件为假,则立即触发一个错误。

在Python中,它大致相当于:

if not condition:
    raise AssertionError()

在Python shell中试试:

>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

断言可以包含可选的消息,您可以在运行解释器时禁用它们。

如果断言失败,打印一条消息:

assert False, "Oh no! This assertion failed!"

不要像调用函数一样使用括号来调用assert。这是一个声明。如果执行断言(condition, message),则运行断言时将使用(condition, message)元组作为第一个参数。

至于禁用它们,当以优化模式运行python时,其中__debug__为False, assert语句将被忽略。只需要传递-O标志:

python -O script.py

相关文档请参见这里。