问题:带有和不带括号的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导致此行为之间有什么区别?我的做法是使用括号,但以上内容表明我不应该这样做。
回答 0
如果您通过完整的解释程序而不是通过IDLE运行最后一个命令assert
,则会给您一个警告(SyntaxWarning: assertion is always true, perhaps remove parentheses?
)。因为assert
是一个关键字而不是一个函数,所以实际上您将元组作为第一个参数传递而忽略了第二个参数。
回想一下,非空元组的计算结果为True
,并且由于断言消息是可选的,因此您在assert True
编写时实际上已经调用了assert(1==2, "hi")
。
回答 1
如果因为需要多行断言而将括号放在此处,则另一种方法是在行的末尾添加反斜杠,如下所示:
foo = 7
assert foo == 8, \
"derp should be 8, it is " + str(foo)
印刷品:
AssertionError: "derp should be 8, it is 7
为什么此python assert
必须与其他所有东西都不同:
我认为python的思想是程序应该自行更正,而不必担心打开断言的特殊标志。关闭断言的诱惑太大,因此已被弃用。
令我烦恼的是,assert
相对于所有其他python编程构造,python 具有唯一的语法,并且此语法再次从python2更改为python3,又从python 3.4更改为3.6。使断言语句从任何版本到任何其他版本都不向后兼容。
这assert
是三级公民的肩膀,它将在python4中完全删除,当然在Python 8.1中也将完全删除。
回答 2
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中的函数-它是关键字。
回答 3
您可以不\
这样来破坏assert语句:
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'
)
回答 4
以下是python doc中引用的内容
声明语句是将调试声明插入程序的便捷方法:
assert_stmt ::= "assert" expression ["," expression]
简单形式,断言表达式,等效于
if __debug__:
if not expression: raise AssertionError
扩展形式,断言expression1,expression2等效于
if __debug__:
if not expression1: raise AssertionError(expression2)
因此,当您在此处使用括号时,您使用的是简单形式,并且该表达式被评估为元组,当转换为布尔值时始终为True