带括号或不带括号的“断言”语句

这里有四个简单的断言调用:

>>> assert 1==2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError


>>> assert 1==2, "hi"
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError: hi


>>> assert(1==2)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError


>>> assert(1==2, "hi")

注意,最后一个不会引发错误。带括号或不带括号的断言调用导致这种行为的区别是什么?我的做法是使用括号,但以上建议我不应该。

55546 次浏览

如果您通过完整解释器而不是 IDLE 运行它,那么最后一个 assert会给您一个警告(SyntaxWarning: assertion is always true, perhaps remove parentheses?)。因为 assert是一个关键字而不是一个函数,所以实际上传入的是一个 tuple 作为第一个参数,而没有传入第二个参数。

回想一下,非空元组的计算结果是 True,并且由于断言消息是可选的,所以在编写 assert(1==2, "hi")时基本上调用了 assert True

assert 1==2, "hi"被解析为 assert 1==2, "hi",“ hi”作为关键字的第二个参数。因此,为什么它正确地给出了一个错误。

assert(1==2)被解析为与 assert 1==2相同的 assert (1==2),因为围绕一个项目的括号不会创建元组,除非后面有一个逗号,例如 (1==2,)

assert(1==2, "hi")被解析为 assert (1==2, "hi"),它不会给出错误,因为非空元组 (False, "hi")不是假值,并且没有提供给关键字的第二个参数。

不应该使用括号,因为 assert不是 Python 中的函数,而是关键字。

如果你把括号放在这里是因为你想要一个多行断言,那么另一种方法就是在行尾放一个反斜杠,如下所示:

foo = 7
assert foo == 8, \
"derp should be 8, it is " + str(foo)

印刷品:

AssertionError: "derp should be 8, it is 7

为什么这个巨蟒 assert必须与其他所有东西不同:

我认为 Python 的意识形态是一个程序应该自我纠正,而不必担心特殊的旗帜来启动断言。关闭断言的诱惑太大了,因此它被否定了。

我和你们一样感到烦恼,Python assert相对于所有其他 Python 编程构造具有独特的语法,这种语法又一次从 python2改为 python3,又一次从 python3.4改为3.6。 使断言语句不向后兼容于任何版本和任何其他版本。

assert是一个三等公民,这是轻而易举的事情,在 python4中它将被完全删除,当然在 Python8.1中也是如此。

以下引自 巨蟒博士

断言语句是将调试断言插入程序的一种方便方法:

assert_stmt ::= "assert" expression ["," expression]

简单的形式断言表达式等效于 如果 _ _ debug _ _: 如果不是表达式,则引发 AssertionError

扩展形式,断言表达式1、表达式2 ,等效于 如果 _ _ debug _ _: 如果不是 Expression1: 引发 AssertionError (Expression2)

所以当你在这里使用括号的时候,你使用的是简单的形式,和 表达式被作为元组计算,当转换为 bool 时始终为 True

你可以像下面这样在没有 \的情况下破坏断言语句:

foo = 7
assert foo == 8, (
'derp should be 8, it is ' + str(foo))

或者如果你有更长的信息:

foo = 7
assert foo == 8, (
'Lorem Ipsum is simply dummy text of the printing and typesetting '
'industry. Lorem Ipsum has been the industry\'s standard dummy text '
'ever since the 1500s'
)

断言 语句 加入或不加入 括号,如下所示是相同的:

assert (x == 3)
assert x == 3

其他声明,例如 如果< strong > for 强大,有或没有 括号,如下所示,也是相同的:


if (x == "Hello"):
if x == "Hello":

while (x == 3):
while x == 3:

for (x) in (fruits):
for x in fruits:


del (x)
del x

此外,基本上,到目前为止我看到的大多数 Python 代码示例都没有对 assertifwhilefordel语句使用 括号,所以我不喜欢对它们使用 括号