Python assert with parentheses 只允许在其中写入部分条件
Python assert with paranthesis allows for only part of the condition to be written within them
谁能解释一下为什么这种绝对奇怪的语法在 Python 中有效(我在 Python 3.7 中测试过)?从功能上讲,它似乎完全等同于逻辑上正确的 assert(5+1 == 6)
,但我不知道为什么这是有效的语法。
assert(5) + 1 == 6
assert
不是函数;这是一个声明。
在这两种情况下,括号都是关键字 assert
之后的表达式的一部分。表达式(5) + 1 == 6
、(5+1 == 6)
和5 + 1 == 6
是等价的,前两种情况的括号是不必要的。
您可以看到解析器对它们的处理方式相同:
>>> import ast
>>> ast.dump(ast.parse("assert(5) + 1 == 6"))
'Module(body=[Assert(test=Compare(left=BinOp(left=Num(n=5), op=Add(), right=Num(n=1)), ops=[Eq()], comparators=[Num(n=6)]), msg=None)])'
>>> ast.dump(ast.parse("assert(5 + 1 == 6)"))
'Module(body=[Assert(test=Compare(left=BinOp(left=Num(n=5), op=Add(), right=Num(n=1)), ops=[Eq()], comparators=[Num(n=6)]), msg=None)])'
>>> ast.dump(ast.parse("assert 5 + 1 == 6"))
'Module(body=[Assert(test=Compare(left=BinOp(left=Num(n=5), op=Add(), right=Num(n=1)), ops=[Eq()], comparators=[Num(n=6)]), msg=None)])'
或让 Python 为您比较字符串,
>>> exprs = ["assert(5) + 1 == 6", "assert(5 + 1 == 6)", "assert 5 + 1 == 6"]
>>> len(set(ast.dump(ast.parse(x)) for x in exprs))
1
更正式地说,assert 语句由 assert
关键字和后跟一两个附加表达式组成。
assert_stmt: 'assert' test [',' test]
第一个被评估为布尔表达式,生成 True
或 False
作为结果。如果第一个表达式是 False
.
,则第二个的值(如果存在)用于构造语句引发的 AssertionError
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert False, 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: 3
>>> assert True
>>> assert True, 3
谁能解释一下为什么这种绝对奇怪的语法在 Python 中有效(我在 Python 3.7 中测试过)?从功能上讲,它似乎完全等同于逻辑上正确的 assert(5+1 == 6)
,但我不知道为什么这是有效的语法。
assert(5) + 1 == 6
assert
不是函数;这是一个声明。
在这两种情况下,括号都是关键字 assert
之后的表达式的一部分。表达式(5) + 1 == 6
、(5+1 == 6)
和5 + 1 == 6
是等价的,前两种情况的括号是不必要的。
您可以看到解析器对它们的处理方式相同:
>>> import ast
>>> ast.dump(ast.parse("assert(5) + 1 == 6"))
'Module(body=[Assert(test=Compare(left=BinOp(left=Num(n=5), op=Add(), right=Num(n=1)), ops=[Eq()], comparators=[Num(n=6)]), msg=None)])'
>>> ast.dump(ast.parse("assert(5 + 1 == 6)"))
'Module(body=[Assert(test=Compare(left=BinOp(left=Num(n=5), op=Add(), right=Num(n=1)), ops=[Eq()], comparators=[Num(n=6)]), msg=None)])'
>>> ast.dump(ast.parse("assert 5 + 1 == 6"))
'Module(body=[Assert(test=Compare(left=BinOp(left=Num(n=5), op=Add(), right=Num(n=1)), ops=[Eq()], comparators=[Num(n=6)]), msg=None)])'
或让 Python 为您比较字符串,
>>> exprs = ["assert(5) + 1 == 6", "assert(5 + 1 == 6)", "assert 5 + 1 == 6"]
>>> len(set(ast.dump(ast.parse(x)) for x in exprs))
1
更正式地说,assert 语句由 assert
关键字和后跟一两个附加表达式组成。
assert_stmt: 'assert' test [',' test]
第一个被评估为布尔表达式,生成 True
或 False
作为结果。如果第一个表达式是 False
.
AssertionError
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert False, 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: 3
>>> assert True
>>> assert True, 3