Они компилируются в один и тот же байт-код, так что да, они эквивалентны.
>>> import dis
>>> dis.dis(lambda: None not in x)
1 0 LOAD_CONST 0 (None)
3 LOAD_GLOBAL 1 (x)
6 COMPARE_OP 7 (not in)
9 RETURN_VALUE
>>> dis.dis(lambda: not None in x)
1 0 LOAD_CONST 0 (None)
3 LOAD_GLOBAL 1 (x)
6 COMPARE_OP 7 (not in)
9 RETURN_VALUE
Документация также дает понять, что они эквивалентны:
x not in s
возвращает отрицание x in s
.
Как вы упоминаете, None not in x
является более естественным английским языком, поэтому я предпочитаю использовать это.
Если вы пишете not y in x
может быть неясно, имелось ли в виду not (y in x)
или (not y) in x
.Нет никакой двусмысленности, если вы используете not in
.