Вот четыре простых вызова 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 с круглыми скобками или без них, который вызывает такое поведение? Моя практика заключается в использовании скобок, но из сказанного выше следует, что я не должен.
python
assert
parentheses
гефан
источник
источник
Ответы:
Последний
assert
выдал бы вам предупреждение (SyntaxWarning: assertion is always true, perhaps remove parentheses?
), если бы вы запустили его через полный интерпретатор, а не через IDLE. Посколькуassert
это ключевое слово, а не функция, вы фактически передаете кортеж в качестве первого аргумента и опускаете второй аргумент.Напомним, что непустые кортежи оцениваются до
True
, и поскольку сообщение утверждения является необязательным, вы, по сути, вызывали,assert True
когда писалиassert(1==2, "hi")
.источник
assert (1==2)
том, что скобки вокруг одного выражения не создают кортеж автоматически; если бы вы это сделали, вы бы получили то же поведение, что и №4assert (1==2,)
. То же самое произошло бы, если бы вы сделалиprint ('foo', 'bar')
вместоprint 'foo', 'bar'
; вы бы увидели вывод кортежаassert(test, message)
вероятно, неверны и, безусловно, сбивают с толку. Без парней!Если вы вставили круглые скобки, потому что хотели многострочное утверждение, то альтернативой является установка обратной косой черты в конце строки, например:
Печать:
Почему этот питон
assert
должен отличаться от всего остального:Я думаю, что идеология питонов состоит в том, что программа должна самокорректироваться, не беспокоясь о специальном флаге для включения утверждений. Искушение отключить утверждения слишком велико, и поэтому оно устарело.
Я разделяю ваше раздражение тем, что Python
assert
имеет уникальный синтаксис по сравнению со всеми другими конструкциями программирования Python, и этот синтаксис снова изменился с python2 на python3 и снова изменился с python 3.4 на 3.6. Обеспечение обратной совместимости операторов assert от любой версии к любой другой версии.Это постукивание по плечу
assert
гражданина 3-го класса, оно будет полностью удалено в python4 и, конечно же, снова в Python 8.1.источник
assert 1==2, "hi"
анализируется какassert 1==2, "hi"
"привет" в качестве второго параметра ключевого слова. Следовательно, почему он правильно выдает ошибку.assert(1==2)
анализируется какassert (1==2)
который идентиченassert 1==2
, поскольку скобки вокруг одного элемента не создают кортеж, если нет конечной запятой, например(1==2,)
.assert(1==2, "hi")
анализируется какassert (1==2, "hi")
, что не вызывает ошибки, потому что непустой кортеж(False, "hi")
не является ложным значением, и для ключевого слова не указан второй параметр.Вы не должны использовать круглые скобки, потому что
assert
это не функция в Python, это ключевое слово.источник
Вы можете прервать оператор assert и без
\
этого:Или, если у вас еще более длинное сообщение:
источник
Ниже приводится цитата из документа Python.
Простая форма выражения assert эквивалентна
if __debug__: if not expression: raise AssertionError
Расширенная форма assert expression1, expression2 эквивалентна
if __debug__: if not expression1: raise AssertionError(expression2)
Итак, когда вы используете здесь круглые скобки, вы используете простую форму, а выражение оценивается как кортеж, который всегда имеет значение True при преобразовании в bool
источник