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. Использовать или нет.

  • Какой лучший скелетный код модуля библиотеки Python?
  • Вкладки и пробелы в программировании на Python
  • Какие шаблоны я мог бы использовать в коде, чтобы упростить перевод на другой язык программирования?
  • Каков стандартный формат docstring Python?
  • Как аккуратно держать под шириной 80 символов с длинными строками?
  • Как вы возвращаете несколько значений в Python?
  • 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 - лучший язык программирования в мире.