Питон `если X не нет " или " если не Х нет`?



Я всегда думал о if not x is None версия, чтобы быть более ясным, но Google гид по стилю и PEP-8 как использовать if x is not None. Есть ли какая-либо незначительная разница в производительности (я предполагаю, что нет), и есть ли случай, когда один действительно не подходит (что делает другого явным победителем для моей конвенции)?*



*Я имею в виду любые синглтон, а не просто None.




...чтобы сравнить синглеты, такие как
Никто. Использовать или не.


982   10  

10 ответов:

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

Python 2.6.2 (r262:71600, Apr 15 2009, 07:20:39)
>>> import dis
>>> def f(x):
...    return x is not None
...
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> def g(x):
...   return not x is None
...
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

стилистически, я стараюсь избегать not x is y. Хотя компилятор всегда будет рассматривать его как not (x is y), человека, читатель может неправильно понять конструкцию как (not x) is y. Если я напишу x is not y тогда нет никакой двусмысленности.

Google и Pythonруководство по стилю является лучшей практикой:

if x is not None:
    # Do something about x

используя not x может привести к нежелательным результатам. Смотрите ниже:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

Вам может быть интересно посмотреть, какие литералы оцениваются True или False в Python:

редактировать для комментариев ниже:

я просто сделал некоторые испытания. not x нет не отрицает x во-первых, а затем по сравнению с None. На самом деле, это кажется is оператор имеет более высокий приоритет при использовании таким образом:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False

таким образом, not x is None просто, по моему честному мнению, лучше избегать.

дополнительно редактировать:

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

это значит if x is not None имеет точный результат как if not x is None. Я исправляюсь. Спасибо букзор.

однако мой ответ все еще стоит:использовать обычные if x is not None. :]

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

ответ проще, чем люди делают это.

нет никакого технического преимущества в любом случае, и "x не y" - это то, что все еще использует, что делает его явным победителем. Не имеет значения, что он" больше похож на английский " или нет; все используют его, что означает, что каждый пользователь Python-даже китайские пользователи, чей язык Python не похож-поймет его с первого взгляда, где немного менее распространенный синтаксис займет пару дополнительных циклов мозга делать грамматический разбор.

Не будьте разными только ради того, чтобы быть разными, по крайней мере, в этой области.

Python if x is not None или if not x is None?

TLDR: компилятор байт-кода анализирует их оба в x is not None - так что для удобства чтения, используйте if x is not None.

читабельности

мы используем Python, потому что мы ценим такие вещи, как человеческая читаемость, удобство использования и правильность различных парадигм программирования над производительностью.

Python оптимизирует для удобочитаемости, особенно в этом контексте.

разбор и компиляция байт-код

The notперсонализация слабее чем is, так что здесь нет никакой логической разницы. Смотрите документация:

операторы is и is not тест на идентичность объекта:x is y - это правда если и только если X и y-один и тот же объект. x is not y дает обратное значение истинности.

The is not специально предусмотрено в Python грамматика как a улучшение читаемости для языка:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

и поэтому это тоже унитарный элемент грамматики.

конечно, это не разбирается же:

>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"

но тогда компилятор байтов фактически переведет not ... is до is not:

>>> import dis
>>> dis.dis(lambda x, y: x is not y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

поэтому для удобства чтения и использования языка, как это было задумано, пожалуйста, используйте is not.

чтобы не использовать не мудрый.

The is not оператор предпочтительнее, чем отрицание результата is по стилистическим причинам. "if x is not None:" читает так же, как английский, но "if not x is None: " требует понимания приоритета оператора и не читается как английский.

если есть разница в производительности мои деньги на is not, но это почти наверняка не является мотивацией для решения предпочесть эту технику. Очевидно, что это будет зависеть от реализации. Так как is не переопределяется, он должен легко оптимизировать любое различие в любом случае.

лично я использую

if not (x is None):

который сразу же без двусмысленности понимается каждым программистом, даже не знающим синтаксиса Python.

if not x is None больше похож на другие языки программирования, но if x is not None определенно звучит более ясно (и более грамматически правильно на английском языке) для меня.

тем не менее, похоже, что это скорее предпочтительная вещь для меня.

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

попробуйте это:

    if x != None:
       # do stuff with x

Comments

    Ничего не найдено.