Каков приоритет операций not и in в Python
Что проверяют
Знаете ли вы таблицу приоритетов, а не угадываете по аналогии с другими языками. Правильный ответ короткий: in связывает сильнее, чем not, поэтому not x in y читается как not (x in y). Следом обычно дают выражение с цепочкой сравнений и просят предсказать результат.
Как отвечать
Приоритеты от слабого к сильному в интересующей части таблицы:
or: самый слабый из логических операторов;and: сильнееor;not: сильнееand, но слабее любых сравнений;- сравнения:
in,not in,is,is not,<,>,==,!=и остальные, у всех один уровень; - арифметика и побитовые операции: ещё выше, поэтому
x + 1 in sозначает(x + 1) in s.
Отсюда not 'a' in 'abc' сначала вычисляет 'a' in 'abc', получает True и отрицает его, итог False. Если бы not был сильнее, выражение превратилось бы в (not 'a') in 'abc', то есть False in 'abc', и упало бы с TypeError. Это хороший аргумент на собеседовании: вы не просто помните правило, а видите, почему иначе быть не может.
Дальше скажите, что not in это отдельный оператор, а не сочетание двух. Линтеры (pycodestyle, ruff, правило E713) просят писать x not in y вместо not x in y: смысл тот же, но читается однозначно.
Упомяните и то, что сравнения в Python образуют цепочки, и in в них участвует наравне с < и ==.
Где спотыкаются
Говорят, что not выполняется первым. В простых примерах результат совпадает, поэтому ошибка живёт долго, пока не встретится выражение, где она меняет ответ.
Не знают про цепочки: 'a' in 'abc' == True даёт False, потому что это ('a' in 'abc') and ('abc' == True), а не сравнение результата с True.
Пытаются написать x == not y и получают SyntaxError: not слабее == и не может стоять справа от сравнения без скобок.