按照 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 有何看法。它们是拐杖吗?
最佳答案
在我看来,if
和 assert
之间有很大的区别:
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/