2010-06-24 79 views
64

这里是断言的四个简单的调用:蟒蛇断言有和没有括号

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

谢谢你的有用的答案。关键字和内置函数之间的区别看起来很微妙。下面是一个关键字列表,我认为应该省略parens:http://docs.python.org/reference/lexical_analysis.html#keywords – 2010-06-24 17:31:42

+1

一个区别是您可以重新定义内置函数,但可以“不要用关键字(不是前者是个好主意)。 – 2010-06-24 17:34:28

回答

78

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

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

+8

原因是'assert(1 == 2)'不会发生'是括号在单个表达式周围不会自动创建一个元组;如果你执行了'assert(1 == 2,)',你会得到与#4相同的行为。如果你用print('foo','bar')而不是'print'foo','bar'';你会看到输出的元组 – 2010-06-24 17:05:18

+0

值得进一步强调的是'assert(test,message)'形式的声明可能是错误的,并且当然会让人困惑。没有parens! – tcarobruce 2010-06-24 17:24:09

+12

那么,什么是缩短长断言陈述的正确方法,w.r.t. PEP8?似乎不可能。 – stantonk 2013-04-11 16:53:14

12

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中的函数 - 它是一个关键字。

10

如果你把括号中的,因为你需要多行断言,那么还有一个办法是把反斜线在这样的行的末尾:

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

打印: Asse田:“ DERP应为8,它是7

0

以下是从python doc

Assert statements are a convenient way to insert debugging assertions into a program:

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

的简单形式中,断言表达引用的,是当量alent到 if __debug__: if not expression: raise AssertionError

的扩展形式,断言表达式,表达式2,相当于 if __debug__: if not expression1: raise AssertionError(expression2)

因此,当你使用括号在这里,您使用的是简单的形式,并的表达评价为一个元组,被铸造为bool

0

可以打破断言语句不\这样当这始终是真实的:

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