ChatGPT解决这个技术问题 Extra ChatGPT

Python中的“断言”有什么用?

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


s
slezica

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。这是一个声明。如果您执行 assert(condition, message),您将使用 (condition, message) 元组作为第一个参数来运行 assert

至于禁用它们,在优化模式下运行 python 时,其中 __debug__False,断言语句将被忽略。只需传递 -O 标志:

python -O script.py

有关相关文档,请参阅 here


尼特:断言是一个语句,而不是一个函数。 unlike print,在 Python 3 中是 still a statement
@Chaine assert 的意思是“确保 *something” 为 True”。因此 assert a == 3 将确保 a 等于 3;如果 a 不等于 3(即 a==3 为 False),那么它将引发错误
如果我只能使用 if not condition: raise AssertError(),我为什么要使用断言?除了作为 if not condition 语句的较短形式之外,还有什么条件可以使断言更好?
完全无法理解这个答案是如何获得这么多赞成票的,实际上其他人也回答了。问题是“Python中的“断言”有什么用?”,所以它在问:何时使用,或者更准确地说:assert的使用场景是什么,但是在阅读了所有答案之后,我完全一无所获我想要!
断言的目的经常被误解。它们不像建议的那样用于早期测试条件,也不是测试表达式的语法糖。它们的目的是“断言”某些条件在程序中的某些点是正确的,目的是帮助程序员了解这些点的系统状态。例如,如果在函数顶部我看到“断言 arg”语句,那么我将毫无疑问地知道 (arg is None) 对于该函数中的任何后续语句都是无效状态,从而减少了我拥有的状态集考虑。
N
Neuron

注意括号。正如在其他答案中指出的那样,in Python 3, assert is still a statement,因此通过与 print(..) 类比,可以将相同的推断推断为 assert(..)raise(..),但您不应该这样做。

这是错误的:

assert(2 + 2 == 5, "Houston we've got a problem")

这是对的:

assert 2 + 2 == 5, "Houston we've got a problem"

第一个不起作用的原因是 bool( (False, "Houston we've got a problem") ) 的计算结果为 True

在语句 assert(False) 中,这些只是围绕 False 的多余括号,用于计算它们的内容。但是对于 assert(False,),括号现在是一个元组,一个非空元组在布尔上下文中计算为 True


我来这里是为了寻找有关括号的确切信息和以下消息。谢谢。
但是 assert (2 + 2 = 5), "Houston we've got a problem" 应该没问题,是吗?
不要忘记人们经常将括号用于符合 PEP 8 的隐式行继续另外也不要忘记元组不是由括号定义而是由逗号的存在定义的(除了出于以下目的之外,元组与括号无关运算符优先级)。
assert (2 + 2 = 5), "Houston we've got a problem" 不起作用...但它与 assert 语句无关,这很好。你的条件不起作用,因为它不是条件。缺少第二个 =
@SherylHohman,assert (2+2==5), “Houston we’ve got a problem 将评估为 assert False, “Houston we’ve got a problem,因此会引发断言错误。这与 assert(2+2==5) 之间是否有空格无关。其他评论者正在谈论的是,当您将 (2+2==5, “Houston we’ve got a problem”) 作为输入传递给 assert 函数时。所以输入实际上是一个由 2 个术语 2+2==5 和“Houston we've got a problem”组成的元组。
R
Ricardo Stuven

正如其他答案所指出的,如果给定条件不成立,assert 类似于抛出异常。一个重要的区别是,如果您使用优化选项 -O 编译代码,断言语句将被忽略。 documentation 表示 assert expression 可以更好地描述为等同于

if __debug__:
   if not expression: raise AssertionError

如果您想彻底测试您的代码,然后在您对所有断言案例都没有失败感到高兴时发布优化版本,这可能很有用 - 当优化开启时,__debug__ 变量变为 False 并且条件将停止评估.如果您依赖断言并且没有意识到它们已经消失,此功能也可以吸引您。


这是否意味着,如果某个变量或正确的输入(根据编写程序的合同)可能导致程序崩溃,当它由用户运行时(假设 -O 标志在用户运行时使用程序),您应该改用 if Not Error: raise Exception(“ this is a error”)?这样,当用户运行它时,程序仍然会显示错误的来源。
另一方面,如果您预计程序可能由于不正确的逻辑/代码实现而出错(但不是由于根据对程序用户的合同的输入),您应该使用 {1 } 陈述?这里的假设是当程序发布给最终用户时,您正在使用 -O 标志,因此假设所有错误都已被删除。因此,任何错误或程序崩溃都是由于对程序的输入根据合同有效,但不能由程序处理。所以它应该这样提醒用户。
@alpha_989 完全正确。我喜欢将断言视为健全性检查,它只是为了帮助您作为开发人员确保您认为正确的内容在您开发时实际上是正确的。
d
dbader

Python 中断言的目标是通知开发人员有关程序中不可恢复的错误。

断言并非旨在表示预期的错误条件,例如“找不到文件”,用户可以在其中采取纠正措施(或只是重试)。

另一种看待它的方式是说断言是代码中的内部自检。它们通过在您的代码中声明某些条件是不可能的来工作。如果这些条件不成立,则意味着程序中存在错误。

如果您的程序没有错误,这些情况将永远不会发生。但是,如果其中一个确实发生了,程序将崩溃,并显示一个断言错误,告诉您确切触发了哪个“不可能”条件。这使得跟踪和修复程序中的错误变得更加容易。

以下是我写的 a tutorial on Python’s assertions 的摘要:

Python 的 assert 语句是一种调试辅助工具,而不是一种处理运行时错误的机制。使用断言的目的是让开发人员更快地找到错误的可能根本原因。除非您的程序中存在错误,否则不应引发断言错误。


谢谢你的文章。非常有助于理解 assert 语句以及何时使用它。我试图理解您在文章中介绍的一些术语。
我想我会在这里发表评论,这样更多的人可能会从澄清中受益。对不起,如果问题太天真。
如果您认为“user.is_admin()”是用户输入,因此不应在 assert statement 中使用,那么 price 也不能被视为用户输入吗?为什么您认为 assert user.is_admin() 是数据验证而不是 assert price
@LaryxDecidua 不,你可以在我的网站上阅读它,该教程是公开的。如果您对时事通讯不感兴趣,只需点击退出或单击小“x”符号。希望这可以帮助 :-)
+1 用于解释何时使用断言。我曾经向我解释过,如果调用者可以通过使用公共 API 触发断言,那么这始终是一个应该修复的错误。断言完成了它的工作并发现了一个真正的错误,或者它是执行公共合同的不正确的断言,应该用一个面临错误的正确调用者来替换。断言用于验证实现的内部私有逻辑,而不是针对调用者执行公共 API 合约。
p
pyrrhic

其他人已经为您提供了文档链接。

您可以在交互式 shell 中尝试以下操作:

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:

第一条语句什么也不做,而第二条语句引发异常。这是第一个提示:断言对于检查代码给定位置(通常是函数的开头(前置条件)和结束(后置条件))中应该为真的条件很有用。

断言实际上与合约编程高度相关,这是一种非常有用的工程实践:

http://en.wikipedia.org/wiki/Design_by_contract


失去括号,断言不是函数。
失去括号比看起来更重要。请参阅below
Assert 实际上可以追溯到图灵(早在“合同”之前),当时他写了一篇关于程序员如何处理创建正确程序这一相当艰巨的任务的最早论文。找到那篇论文留给读者作为练习,因为所有程序员都可以从熟悉他的工作中受益。 :-) turingarchive.org
b
binaryfunt

来自文档:

断言语句是将调试断言插入程序的便捷方式

您可以在此处阅读更多信息:http://docs.python.org/release/2.5.2/ref/assert.html


我喜欢这个评论,因为它只是非常清楚地解释了它是什么。我的问题是“如果我写了一个适当的单元测试,我为什么需要一个断言”?无论如何,这些东西都不会在生产中运行。
如果你想为每一个可能的极端情况编写一个单元测试,那么你不需要断言。但是断言可以更快地编写并且更简洁。它们还有助于代码的可读性,因为它们在代码中应该为真的地方断言某些东西是真的,而单元测试通常甚至不在同一个文件中。
I
Ian Goldby

assert 语句有两种形式。

简单形式 assert <expression> 等价于

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

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

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

J
Jacob Abraham

断言是检查程序内部状态是否符合程序员预期的系统方法,目的是捕捉错误。请参见下面的示例。

>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>> 

此外,断言通常可以用于单元测试程序。 stackoverflow.com/questions/1383/what-is-unit-testing
你的答案是正确的,但这个例子是一个非常糟糕的例子。不应使用断言来验证用户输入,因为根据编译标志,可以禁用断言。一个更好的例子是调用为正数定义的函数但传递一个负数。
否! 在您的示例中,如果有人输入负数,这不是代码中的错误,因此断言是完全不合适的。一个更好(但仍然相当简单)的示例是 assert math.pow(number, 2) >= 0,因为您可以保证对于任何数字都是如此,除非 math.pow() 代码中存在错误。
G
Gaurav Agarwal

这是一个简单的示例,将其保存在文件中(比如说 b.py)

def chkassert(num):
    assert type(num) == int


chkassert('a')

$python b.py 时的结果

Traceback (most recent call last):
  File "b.py", line 5, in <module>
    chkassert('a')
  File "b.py", line 2, in chkassert
    assert type(num) == int
AssertionError

a
avandeursen

C2 Wiki 上的简明总结:

断言是程序中特定点的布尔表达式,除非程序中存在错误,否则它将为真。

您可以使用 assert 语句来记录您对特定程序点的代码的理解。例如,您可以记录有关输入(前置条件)、程序状态(不变量)或输出(后置条件)的假设或保证。

如果您的断言失败,这会提醒您(或您的继任者)您在编写程序时对程序的理解是错误的,并且它可能包含错误。

有关更多信息,John Regehr 在 Use of Assertions 上有一篇精彩的博文,它也适用于 Python assert 语句。


+1 指出使用 assert 语句有助于记录程序员对代码的理解。
s
slayer

assert 语句几乎存在于所有编程语言中。它有助于在您的程序早期发现问题,原因是明确的,而不是稍后作为某些其他操作的副作用。他们总是期待一个 True 条件。

当您执行以下操作时:

assert condition

您是在告诉程序测试该条件并在它为假时立即触发错误。

在 Python 中,assert expression 等价于:

if __debug__:
    if not <expression>: raise AssertionError

您可以使用扩展表达式传递可选消息:

if __debug__:
    if not (expression_1): raise AssertionError(expression_2)

在 Python 解释器中尝试:

>>> assert True # Nothing happens because the condition returns a True value.
>>> assert False # A traceback is triggered because this evaluation did not yield an expected value.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

在使用它们之前有一些注意事项,主要针对那些认为在 assertif 语句之间切换的人。使用 assert 的目的是在程序验证条件并返回一个应该立即停止程序而不是采取其他方法绕过错误的情况下:

1.括号

您可能已经注意到,assert 语句使用两个条件。因此,不要使用括号将它们作为一个明确的建议。如果您这样做:

assert (condition, message)

例子:

>>> assert (1==2, 1==1)
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?

您将使用表示元组的 (condition, message) 作为第一个参数来运行 assert,这会导致 Python 中的非空元组始终为 True。但是,您可以毫无问题地单独执行:

assert (condition), "message"

例子:

>>> assert (1==2), ("This condition returns a %s value.") % "False"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: This condition returns a False value.

2.调试目的

如果您想知道何时使用 assert 语句。举一个现实生活中使用的例子:

* 当您的程序倾向于控制用户输入的每个参数或其他任何参数时:

def loremipsum(**kwargs):
    kwargs.pop('bar') # return 0 if "bar" isn't in parameter
    kwargs.setdefault('foo', type(self)) # returns `type(self)` value by default
    assert (len(kwargs) == 0), "unrecognized parameter passed in %s" % ', '.join(kwargs.keys())

另一种情况是在数学上,当某个方程上的系数或常数为 0 或非正数时:

def discount(item, percent):
    price = int(item['price'] * (1.0 - percent))
    print(price)
    assert (0 <= price <= item['price']),\
            "Discounted prices cannot be lower than 0 "\
            "and they cannot be higher than the original price."

    return price

* 甚至是一个简单的布尔实现示例:

def true(a, b):
    assert (a == b), "False"
    return 1

def false(a, b):
    assert (a != b), "True"
    return 0

3. 数据处理或数据验证

最重要的是不要依赖 assert 语句来执行数据处理或数据验证,因为可以在 Python 初始化时使用 -O-OO 标志关闭此语句 - 表示值 1、2 和 0 (默认),分别 - 或 PYTHONOPTIMIZE 环境变量。

值 1:

* 断言被禁用;

* 字节码文件是使用 .pyo 扩展而不是 .pyc 生成的;

* sys.flags.optimize 设置为 1 (True);

* 并且,__debug__ 设置为 False

值 2:禁用更多的东西

文档字符串被禁用;

因此,使用 assert 语句来验证某种预期数据是极其危险的,甚至暗示了一些安全问题。然后,如果您需要验证某些权限,我建议您改为 raise AuthError。作为前置条件有效,程序员通常在没有用户直接交互的库或模块上使用 assert


S
Shawn Mehan

如果断言后的语句为真,则程序继续,但如果断言后的语句为假,则程序出错。就那么简单。

例如:

assert 1>0   #normal execution
assert 0>1   #Traceback (most recent call last):
             #File "<pyshell#11>", line 1, in <module>
             #assert 0>1
             #AssertionError

a
alwbtc

在 Pycharm 中,如果您使用 assertisinstance 来声明对象的类型,它将让您在编码时访问父对象的方法和属性,它会自动完成。

例如,假设 self.object1.object2 是一个 MyClass 对象。

import MyClasss

def code_it(self):
    testObject = self.object1.object2 # at this point, program doesn't know that testObject  is a MyClass object yet
    assert isinstance(testObject , MyClasss) # now the program knows testObject is a MyClass object
    testObject.do_it() # from this point on, PyCharm will be able to auto-complete when you are working on testObject

r
rassa45

如果您想确切了解保留函数在 python 中的作用,请输入 help(enter_keyword)

如果您输入的是保留关键字,请确保将其作为字符串输入。


N
Nitish Chauhan

Python 断言基本上是一种调试辅助工具,用于测试代码内部自检的条件。当您的代码遇到不可能的边缘情况时,Assert 使调试变得非常容易。断言检查那些不可能的情况。

假设有一个函数可以计算折扣后的商品价格:

def calculate_discount(price, discount):
    discounted_price = price - [discount*price]
    assert 0 <= discounted_price <= price
    return discounted_price

在这里,discounted_price 永远不能小于 0 并且大于实际价格。因此,如果违反上述条件,assert 会引发 Assertion Error,这有助于开发人员识别不可能发生的事情。

希望能帮助到你 :)


assert 在调试上下文中很有用,但不应依赖于调试上下文之外。
U
U12-Forward

我的简短解释是:

如果表达式为假,assert 引发 AssertionError,否则继续代码,如果有逗号,无论它是什么,它都会是 AssertionError:whatever after comma,代码就像:raise AssertionError(whatever after comma)

关于这个的相关教程:

https://www.tutorialspoint.com/python/assertions_in_python.htm


答案提供了如何 使用 assert,但没有提供何时 使用(或不使用)assert;另请注意,如果 __debug__False,则可以禁用 assert 会很有用。
j
jferard

正如在其他答案中所写,assert 语句用于检查程序在给定点的状态。

我不会重复有关关联消息、括号或 -O 选项和 __debug__ 常量的内容。另请查看 the doc 以获取第一手信息。我将专注于您的问题:assert 有什么用?更准确地说,何时(以及何时不)应该使用 assert

assert 语句对于调试程序很有用,但不鼓励检查用户输入。我使用以下经验法则:保留断言以检测 这不应该发生 的情况。用户输入可能不正确,例如密码太短,但这不是不应该发生的情况。如果圆的直径不是其半径的两倍,那么您就处于这不应该发生的情况。

在我看来,最有趣的是 assert 的使用受到 B. Meyer 在 [面向对象的软件构造]( https://www.eiffel.org/doc/eiffel/Object-Oriented_Software_Construction%2C_2nd_Edition ) 中描述的 programming by contract 的启发,并在 [Eiffel 编程语言]( { 3})。您无法使用 assert 语句完全模拟按合同编程,但保持意图很有趣。

这是一个例子。假设您必须编写一个 head 函数(如 Haskell 中的 [head 函数](http://www.zvon.org/other/haskell/Outputprelude/head_f.html))。您给出的规范是:“如果列表不为空,则返回列表的第一项”。查看以下实现:

>>> def head1(xs): return xs[0]

>>> def head2(xs):
...     if len(xs) > 0:
...         return xs[0]
...     else:
...         return None

(是的,这可以写成 return xs[0] if xs else None,但这不是重点)

如果列表不为空,则两个函数的结果相同,并且此结果是正确的:

>>> head1([1, 2, 3]) == head2([1, 2, 3]) == 1
True

因此,这两种实现都是(我希望)正确的。当您尝试获取空列表的头项时,它们会有所不同:

>>> head1([])
Traceback (most recent call last):
...
IndexError: list index out of range

但:

>>> head2([]) is None
True

同样,这两种实现都是正确的,因为没有人应该将空列表传递给这些函数(我们超出规范)。这是一个错误的调用,但如果你这样做,任何事情都可能发生。一个函数引发异常,另一个函数返回一个特殊值。最重要的是:我们不能依赖这种行为。如果 xs 为空,这将起作用:

print(head2(xs))

但这会使程序崩溃:

print(head1(xs))

为了避免一些意外,我想知道我何时将一些意想不到的参数传递给函数。换句话说:我想知道什么时候可观察到的行为不可靠,因为它取决于实现,而不是规范。当然,我可以阅读规范,但程序员并不总是仔细阅读文档。

想象一下,如果我有办法将规范插入代码以获得以下效果:当我违反规范时,例如通过将空列表传递给 head,我会收到警告。这对编写一个正确的(即符合规范的)程序有很大帮助。这就是 assert 进入现场的地方:

>>> def head1(xs):
...     assert len(xs) > 0, "The list must not be empty"
...     return xs[0]

>>> def head2(xs):
...     assert len(xs) > 0, "The list must not be empty"
...     if len(xs) > 0:
...         return xs[0]
...     else:
...         return None

现在,我们有:

>>> head1([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty

和:

>>> head2([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty

请注意,head1 会引发 AssertionError,而不是 IndexError。这很重要,因为 AssertionError 不是 any 运行时错误:它表示违反规范。我想要一个警告,但我得到一个错误。幸运的是,我可以禁用检查(使用 -O 选项),但风险自负。我会这样做,崩溃真的很昂贵,希望最好。想象一下,我的程序嵌入在一个穿越黑洞的宇宙飞船中。我将禁用断言,并希望程序足够健壮,不会尽可能长时间地崩溃。

此示例仅涉及前置条件,您可以使用 assert 检查后置条件(返回值和/或状态)和不变量(类的状态)。请注意,使用 assert 检查后置条件和不变量可能很麻烦:

对于后置条件,您需要将返回值分配给变量,并且如果您正在处理方法,则可能存储对象的初始状态;

对于不变量,您必须检查方法调用前后的状态。

您不会拥有像 Eiffel 那样复杂的东西,但是您可以提高程序的整体质量。

总而言之,assert 语句是一种检测不应该发生情况的便捷方法。违反规范(例如,将空列表传递给 head)是第一类这不应该发生 的情况。因此,虽然 assert 语句可用于检测任何意外情况,但它是确保满足规范的一种特权方式。一旦您在代码中插入 assert 语句来表示规范,我们希望您提高了程序的质量,因为不正确的参数、不正确的返回值、不正确的类状态......将被报告。


M
Misaal D'souza

断言是在我们的程序中自信地陈述事实的陈述。

语法:assert <condition>assert <condition>,<error message>

它有一个条件/表达式,应该始终为真。如果条件为假,assert 语句将停止程序并抛出一条错误消息,即 AssertionError。所以你的断言表达式将是你的程序中不想要的东西。

例如

assert -- 使用不带 的 assert var = int(input("Enter value 1-9 inclusive:")) assert var!=0 print(var) Output : If input is 0 : AssertionError If input is 1 : 1 assert , -- 使用带有 的 assert var = int(input("Enter value 1-9 inclusive:")) assert var!=0,"Input cannot be zero " print(var) 输出:如果输入为 0:AssertionError:输入不能为零如果输入为 1:1

关键点 :

它用作调试工具。它需要一个表达式和一个可选消息。它几乎存在于所有编程语言中


我会给你一个 + 的描述,但 - 然后使用 assert 进行输入验证。净得分:无。
U
User

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

示例 1:

a = 5
b = 6

assert a == b

输出:

AssertionError

这是因为,显然 a 不等于 b。如果您想在代码中引发 Exception,这将特别有用。

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

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


请正确格式化您的代码。另外,这对以前的答案有何改进?
我的解释有什么问题吗?
您的解释并没有为现有答案添加任何内容,而且糟糕的语法使其难以阅读。如果您正在寻找要回答的问题,请考虑浏览新的问题提要。
提供的答案确实回答了如何 使用 assert,但没有回答 何时 使用(或不使用)assert
b
bhavya joshi

格式:assert Expression[,arguments] 当 assert 遇到语句时,Python 计算表达式。如果语句不正确,则引发异常(assertionError)。如果断言失败,Python 使用 ArgumentExpression 作为 AssertionError 的参数。 AssertionError 异常可以像使用 try-except 语句的任何其他异常一样被捕获和处理,但如果不处理,它们将终止程序并产生回溯。例子:

def KelvinToFahrenheit(Temperature):    
    assert (Temperature >= 0),"Colder than absolute zero!"    
    return ((Temperature-273)*1.8)+32    
print KelvinToFahrenheit(273)    
print int(KelvinToFahrenheit(505.78))    
print KelvinToFahrenheit(-5)    

执行上述代码时,会产生以下结果:

32.0
451
Traceback (most recent call last):    
  File "test.py", line 9, in <module>    
    print KelvinToFahrenheit(-5)    
  File "test.py", line 4, in KelvinToFahrenheit    
    assert (Temperature >= 0),"Colder than absolute zero!"    
AssertionError: Colder than absolute zero!    

C
Cleb
def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

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


这会起作用,但据我了解,断言不应该用于检查用户输入,因为它们可以在运行时关闭。如果您真的想强制或验证用户输入,请使用if not user_key: raise ValueError()在此处检查最后 2 段:wiki.python.org/moin/UsingAssertionsEffectively
assert 不应用于输入验证,因为如果 __debug__False,验证将被删除。此外,将断言用于非调试目的可能会导致人们捕捉到生成的 AssertionError,这会使调试变得更加困难而不是更少。
r
rianhariadi.com
>>>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
>>>