Python断言是否拐杖?

时间:2015-02-28 10:05:29

标签: python assertions duck-typing

正如Python wiki断言所建议的

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

但是使用断言和使用' if&#39>之间的优势在哪里?接下来提出例外的陈述?

例如。

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

VS

def some_domain_operation(user, invoice):
    if not isinstance(user, (User, int)):
        raise ValueError()

    # Do something.

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

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

1 个答案:

答案 0 :(得分:1)

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

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

从字面上看,一个断言说“在程序流程的这一点上确实如此。在任何情况下,这个表达式都不会评估为假”。

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

assert isinstance(user, (User, int))

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


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

[2]你应该从不抓住AssertionError,除非你需要抓住AssertionError