Python断言是否拐杖?

Are Python assertions crutches?

本问题已经有最佳答案,请猛点这里访问。

正如Python维基中所建议的那样断言是有益的

  • 检查参数类型,类或值
  • 检查数据结构不变量
  • 检查"不可能发生"的情况(列表中的重复,相互矛盾的状态变量)
  • 调用函数后,确保其返回是合理的

但是,使用断言和使用"if"语句与下一步提出异常之间的优势在哪里?

例如。

1
2
3
def some_domain_operation(user, invoice):
    assert isinstance(user, (User, int))
    # Do something.

VS

1
2
3
4
5
def some_domain_operation(user, invoice):
    if not isinstance(user, (User, int)):
        raise ValueError()

    # Do something.

我认为使用断言是不可靠的(可以被用户禁用),所以我不能给出一个很好的例子,当使用断言比使用raise next使用显式的'if'更好。

你对断言Pn python你有什么看法? 他们是拐杖吗?


在我看来,ifassert之间存在很大差异:

assert之后的表达式永远不会成立[1]。 如果确实如此,你的程序也可能会停止执行,因为我们不知道什么是真的。 [2]它们只是调查源代码的开发人员的调试和文档辅助工具。

从字面上看,一个断言说"这在程序流程的这一点上是正确的。在任何情况下,这个表达式都不会被评估为假"。

因此,assert应被视为不变量。 在正确编写的模块中,不会遇到assert。 如果我们考虑你的情况:

1
assert isinstance(user, (User, int))

如果禁用此assert将改变模块的行为,则它不应再为assert,而是提高TypeError

[1] ......在一个表现良好,写得正确的程序中。

[2]你永远不应该捕捉AssertionError,除非你需要捕捉AssertionError