"Ни один не в" против "не Ни один" - PullRequest
6 голосов
/ 31 августа 2010

Если я не сумасшедший if None not in x и if not None in x эквивалентны. Есть ли предпочтительная версия? Я думаю, None not in более англоязычный и поэтому более питонический, но not None in больше похож на синтаксис другого языка Есть ли предпочтительная версия?

Ответы [ 2 ]

14 голосов
/ 31 августа 2010

Они компилируются в один и тот же байт-код, так что да, они эквивалентны.

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

7 голосов
/ 31 августа 2010

Выражение

not (None in x) 

(для ясности добавлены парены) - это обычное логическое отрицание.Тем не менее,

None not in x

- это специальный синтаксис, добавленный для более читабельного кода (здесь нет возможности и нет смысла использовать и, или, и т. Д. Перед in).Если этот особый случай был добавлен, используйте его.

То же самое относится к

foo is not None

против

not foo is None

Я считаю, что "не" намного понятнее для чтения,В качестве дополнительного бонуса, если выражение является частью большего логического выражения, область действия not сразу становится ясной.

...