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

新手上路,请多包涵

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

原文由 Hossein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 463
2 个回答

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

  1. 它有助于在您的程序早期发现问题,原因是明确的,而不是稍后在某些其他操作失败时。例如,Python 中的类型错误可能会在实际引发 Exception 之前经过几层代码,如果没有及早发现的话。

  2. 它作为阅读代码的其他开发人员的文档,他们看到 assert 并且可以自信地说从现在开始它的条件成立。

当你这样做…

 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) 您将运行 assert(condition, message) 元组作为第一个参数。

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

 python -O script.py

有关相关文档,请参见 此处

原文由 slezica 发布,翻译遵循 CC BY-SA 4.0 许可协议

注意括号。正如其他答案所指出的那样, 在 Python 3 中, assert 仍然是一个语句,因此通过类比 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

原文由 Evgeni Sergeev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题