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

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

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

… сравнивать синглтоны вроде None. Использовать или нет.

11 Solutions collect form web for “Python `if x is not None` или` if not x is None '?”

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

 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 а (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 is None не отрицает x сначала, а затем сравнивается с None . На самом деле, кажется, что оператор имеет более высокий приоритет при использовании таким образом:

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

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

Другие изменения:

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

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

Тем не менее, мой ответ по-прежнему стоит: используйте обычный, if x is not None . :]

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

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

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

Оператор is not является предпочтительным по сравнению с отрицанием результата по стилистическим причинам. « if x is not None: » читается точно так же, как на английском языке, но « if not x is None: требуется понимание приоритета оператора и не читается как английский.

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

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

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

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

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

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

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

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

Операторы is и is not проверяют идентификатор объекта: x is y истинным тогда и только тогда, когда x и y являются одним и тем же объектом. x is not y дает обратное значение истины.

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

 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 .

Не использовать это не мудро.

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

Это сказало, кажется, что это больше для меня предпочтение.

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

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

 if not (x is None): 

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

 x = None if not x: print x, '2.?' 

Нет 2.?

 from __future__ import print_function if(not x): print(x, '3.?') 

(Нет, «3.?»)

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

  if x != None: # do stuff with x 
Python - лучший язык программирования в мире.