gae*_*fan 91 python assert parentheses
这里有四个简单的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")
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个不会引发错误.调用带或不带括号的断言会导致这种行为有什么区别?我的做法是使用括号,但上面的建议我不应该这样做.
Mar*_*off 113
如果你通过一个完整的解释器,而不是通过IDLE运行它,最后assert会给你一个警告(SyntaxWarning: assertion is always true, perhaps remove parentheses?).因为assert是一个关键字而不是一个函数,所以你实际上是将一个元组作为第一个参数传递而不是第二个参数.
回想一下非空元组的计算结果True,并且因为断言消息是可选的,所以你在assert True编写时基本上都会调用它assert(1==2, "hi").
Eri*_*ski 23
如果你把括号放在那里因为你想要一个多行断言,那么另一种方法就是在行的末尾放一个反斜杠,如下所示:
foo = 7
assert foo == 8, \
"derp should be 8, it is " + str(foo)
Run Code Online (Sandbox Code Playgroud)
打印:
AssertionError: "derp should be 8, it is 7
Run Code Online (Sandbox Code Playgroud)
assert必须与其他所有东西不同:我认为pythonic意识形态是程序应该自我纠正而不必担心打开断言的特殊标志.关闭断言的诱惑太大了,因此它被弃用了.
我分享你的烦恼,python assert具有相对于所有其他python编程结构的独特语法,并且这种语法再次从python2更改为python3并再次从python 3.4更改为3.6.使断言语句不能从任何版本向后兼容到任何其他版本.
这assert是一个三等公民的肩膀,它将在python4中完全删除,当然再次在Python 8.1中.
Amb*_*ber 16
assert 1==2, "hi"解析为assert 1==2, "hi""hi"作为关键字的第二个参数.因此,为什么它恰当地给出了错误.
assert(1==2)被解析为与之assert (1==2)相同assert 1==2,因为围绕单个项目的parens不会创建元组,除非有一个尾随逗号,例如(1==2,).
assert(1==2, "hi")解析为assert (1==2, "hi"),因为非空元组(False, "hi")不是false值,并且没有提供给关键字的第二个参数,因此不会产生错误.
你不应该使用括号,因为assert它不是Python中的函数 - 它是一个关键字.
kar*_*tan 11
你可以不用\这样打破assert语句:
foo = 7
assert foo == 8, (
'derp should be 8, it is ' + str(foo))
Run Code Online (Sandbox Code Playgroud)
或者,如果您有更长的消息:
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'
)
Run Code Online (Sandbox Code Playgroud)