python声明有和没有括号

这里有四个简单的assert调用:

>>> 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") 

请注意,最后一个不会引发错误。 调用assert有或没有引起这种行为的括号之间有什么区别? 我的做法是使用括号,但是上面提示我不应该这样做。

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

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

assert 1==2, "hi"被parsing为assert 1==2, "hi"和“hi”作为关键字的第二个参数。 因此为什么它适当地给出一个错误。

assert(1==2)被parsing为assert (1==2) ,它与assert 1==2相同,因为单个项目的parens不会创build一个元组,除非有一个尾随逗号,例如(1==2,)

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

你不应该使用括号,因为assert不是Python中的函数 – 这是一个关键字。

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

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

打印:AssertionError:“derp应该是8,是7