Питон `если X не нет " или " если не Х нет`?
Я всегда думал о if not x is None версия, чтобы быть более ясным, но Google гид по стилю и PEP-8 как использовать if x is not None. Есть ли какая-либо незначительная разница в производительности (я предполагаю, что нет), и есть ли случай, когда один действительно не подходит (что делает другого явным победителем для моей конвенции)?*
*Я имею в виду любые синглтон, а не просто None.
...чтобы сравнить синглеты, такие как
Никто. Использовать или не.
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чем я думаю, как в конечном итоге написать код обработки приоритета операторов для того, чтобы произвести гораздо более читаемый код.
Comments