【发布时间】:2012-11-15 01:45:30
【问题描述】:
在 Python 中,assert 是一个语句,而不是一个函数。这是一个深思熟虑的决定吗?让assert 成为语句(和保留字)而不是函数有什么好处吗?
根据thedocs,assert expression1, expression2扩展为
if __debug__:
if not expression1: raise AssertionError(expression2)
文档还说“当在编译时请求优化时,当前的代码生成器不会为断言语句发出代码。”在不知道细节的情况下,似乎需要一个特殊情况才能使这成为可能。但是,也可以使用一种特殊情况来优化对 assert() 函数的调用。
如果assert 是一个函数,你可以这样写:
assert(some_long_condition,
"explanation")
但是因为assert 是一个语句,所以元组的计算结果总是True,并且
你得到
SyntaxWarning: assertion is always true, perhaps remove parentheses?
正确的写法是
assert some_long_condition, \
"explanation"
这可以说是不那么漂亮了。
【问题讨论】:
-
这有点令人惊讶,它没有被转换为带有
print的函数。虽然,我不喜欢使用原始的assert语句。我只在测试代码中使用unittest.TestCase.assertTrue()和朋友,并保持生产代码无断言。 -
当参数在技术上是有效的但关于它们的一些重要假设(通常是环境的其他部分)不成立时,我会抛出
AssertionError。当然,前提是没有更好的类别。
标签: python language-design assert