Я всегда думал, что if not x is None
версия будет более понятной, но руководство по стилю Google и PEP-8 используют оба if x is not None
. Есть ли небольшая разница в производительности (я предполагаю, что нет), и есть ли случай, когда один действительно не подходит (делая другого явным победителем для моего соглашения)? *
* Я имею в виду любой синглтон, а не просто None
.
... сравнивать синглтоны как None. Использование есть или нет.
python
coding-style
boolean-expression
orokusaki
источник
источник
is not
оператор сам по себе. Как!=
. Если вы предпочитаете,not x is None
то вы должны также предпочестьnot a == b
болееa != b
.not x is None
(ответы здесь убедили меня) - однако стоит отметить, чтоnot a == b
это предпочтительный стиль в Python по сравнению сa != b
.not a == b
действительно предпочитаемый стиль? Я никогда не видел, чтобы это делалось таким образом, и везде, куда я смотрю, люди все используют!=
.!=
вместо двух операторовnot
,==
.Ответы:
Разницы в производительности нет, так как они компилируются в один и тот же байт-код:
Стилистически стараюсь избегать
not x is y
. Хотя компилятор всегда будет воспринимать это какnot (x is y)
, читатель-человек может неправильно понять конструкцию как(not x) is y
. Если я пишу,x is not y
тогда нет никакой двусмысленности.источник
x is (not y)
. Но я склонен согласиться с вами по другим причинам.Как руководство по стилям Google, так и Python - лучшая практика:
Использование
not x
может привести к нежелательным результатам.См. ниже:
Вам может быть интересно посмотреть, какие литералы оцениваются
True
илиFalse
в Python:Изменить для комментария ниже:
Я только что сделал еще несколько испытаний.
not x is None
не отрицаетx
сначала, а затем по сравнению сNone
. На самом деле, кажется, чтоis
оператор имеет более высокий приоритет при использовании таким образом:Поэтому
not x is None
просто, по моему честному мнению, лучше всего избегать.Больше редактировать:
Я только что провел дополнительное тестирование и могу подтвердить, что комментарий Букзора правильный. (По крайней мере, я не смог доказать это иначе.)
Это средство
if x is not None
имеет точный результат какif not x is None
. Я стою исправлено. Спасибо букзор.Тем не менее, мой ответ остается в силе: используйте обычные
if x is not None
.:]
источник
Код должен быть написан, чтобы быть понятным программисту в первую очередь, а компилятор или интерпретатор - вторым. Конструкция «нет» больше напоминает английский, чем «не есть».
источник
TLDR: компилятор байт-кода анализирует их оба
x is not None
- так что для удобства чтения используйтеif x is not None
.читабельность
Мы используем Python, потому что мы ценим такие вещи, как удобочитаемость, удобство использования и правильность различных парадигм программирования по сравнению с производительностью.
Python оптимизирует читабельность, особенно в этом контексте.
Разбор и компиляция байт-кода
В
not
связывает более слабо , чемis
, так что нет никакой логической разницы здесь. Смотрите документацию :Это
is not
специально предусмотрено в грамматике Python как улучшение читаемости языка:И поэтому это также унитарный элемент грамматики.
Конечно, это не разобрано так же
Но тогда байтовый компилятор фактически переведет
not ... is
вis not
:Так что для удобства чтения и использования языка, как это было задумано, пожалуйста, используйте
is not
.Не использовать это не разумно.
источник
not
Связывает слабее, чемis
, поэтому здесь нет логической разницы» - за исключением того, что Python не должен обеспечивать соблюдение логических и алгебраических идентификаторов (нет внутренней причины для(1 + 2)*3
оценки так же, как1*3 + 2*3
). Здесь, очевидно, Python обманывает и оптимизируетUNARY_NOT
.Ответ проще, чем делают люди.
Технического преимущества в любом случае не существует, и «x is y» - это то , что используют все остальные , что делает его очевидным победителем. Неважно, что это «больше похоже на английский» или нет; каждый использует его, что означает, что каждый пользователь Python - даже китайские пользователи, чей язык Python не похож на другой - поймет это с первого взгляда, где чуть менее распространенный синтаксис потребует парочку дополнительных мозговых циклов для анализа.
Не отличайтесь только ради того, чтобы быть другим, по крайней мере, в этой области.
источник
is not
Оператор предпочтительнее , чем отрицающий результатis
по стилистическим причинам. "if x is not None:
" читает так же, как английский, но "if not x is None:
" требует понимания приоритета оператора и не читает как английский.Если есть разница в производительности, на которой лежат мои деньги
is not
, но это почти наверняка не является мотивацией для решения предпочесть эту технику. Очевидно, это будет зависеть от реализации. Посколькуis
его нельзя переопределить, все равно должно быть легко оптимизировать любые различия.источник
Лично я пользуюсь
что понимается сразу без двусмысленности каждым программистом, даже не разбирающимся в синтаксисе Python.
источник
if not x is None
больше похож на другие языки программирования, ноif x is not None
определенно звучит более четко (и более грамматически правильно на английском) для меня.Тем не менее, мне кажется, что это больше для меня.
источник
Я бы предпочел более читаемую форму,
x is not y
чем я думал бы, как в конечном итоге написать код обработки приоритета операторов, чтобы создать гораздо более читаемый код.источник