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 со скобкой или без нее, которая вызывает это поведение? Моя практика заключается в использовании скобок, но вышеизложенное предполагает, что я не должен.

Ответ 1

Последний assert дал бы вам предупреждение (SyntaxWarning: assertion is always true, perhaps remove parentheses?), если вы запустили его через полный интерпретатор, а не через IDLE. Поскольку assert - это ключевое слово, а не функция, вы фактически передаете кортеж в качестве первого аргумента и оставляете второй аргумент.

Вспомним, что непустые кортежи оцениваются до True, и поскольку сообщение утверждения является необязательным, вы, по сути, называете assert True при написании assert(1==2, "hi").

Ответ 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

Если вы помещаете туда скобки, потому что вам требуется многострочное утверждение, то альтернативой является поместить обратную косую черту в конце строки следующим образом:

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

Печать:   AssertionError: "derp должно быть 8, это 7