Python Утверждение с паратезом допускает, что в них записывается только часть условия - PullRequest
0 голосов
/ 19 февраля 2020

Может кто-нибудь объяснить, почему этот абсолютно странный синтаксис работает в Python (я тестировал в Python 3.7)? Функционально он выглядит совершенно эквивалентным логически ядром assert(5+1 == 6), но я понятия не имею, почему это допустимый синтаксис.

assert(5) + 1 == 6

1 Ответ

2 голосов
/ 19 февраля 2020

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. Значение второго, если оно присутствует, используется для построения AssertionError, возбуждаемого оператором, если первое выражение False.

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