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