python - Python 断言是拐杖吗?

标签 python assertions duck-typing

按照 Python wiki 中的建议断言有利于

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

但是使用断言和使用“if”语句并接下来引发异常之间的优势在哪里?

例如。

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

对比

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

    # Do something.

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

您对断言 Pn python 有何看法。它们是拐杖吗?

最佳答案

在我看来,ifassert 之间有很大的区别:

assert 之后的表达式为 never true [1]。如果这是真的,你的程序可能会在那时停止执行,因为我们不再知道什么是真的。 [2] 它们只是为研究源代码的开发人员提供调试和文档帮助。

从字面上看,断言表示“在程序流程的这一点上这是正确的。在任何情况下,该表达式的计算结果都不会为假”。

因此,断言应被视为不变量。在正确编写的模块中,不会命中任何 assert。如果我们考虑您的情况:

assert isinstance(user, (User, int))

如果禁用此 assert 会更改模块的行为,则它不应再是 assert,而应引发 TypeError

<小时/>

[1] ...在一个行为良好、编写正确的程序中。

[2] 你应该永远捕获AssertionError,除非在需要捕获AssertionError的情况下

关于python - Python 断言是拐杖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28780493/

相关文章:

python - 从 SciPy 稀疏矩阵获取左、右、上、下非零邻居

python - Django 中的 INSTALLED_APPS 设置实际上做了什么?

.net - Xunit : Perform all 'Assert' ions in one test method?

Ruby minitest assert_output 语法

python - 始终打印 ] -100 之间的随机值; 100 [ 作为点前 2 位数字和点后 2 位数字,python 3

Python pandas 从字符串中删除子字符串之后的部分

qt - 为什么Q_ASSERT而不是断言

f# - 为什么这个静态类型成员访问认为它是一个 getter?

python - 在这种情况下,如何平衡 "Pythonic"和 "convenient"?

Scala 适配器模式 - 自动允许具有相同方法的类使用 "duck typing"