Eu sempre achei a if not x is None
versão mais clara, mas o guia de estilo do Google e o PEP-8 usam if x is not None
. Existe alguma diferença de desempenho menor (suponho que não) e existe algum caso em que um realmente não se encaixa (tornando o outro um claro vencedor da minha convenção)? *
* Estou me referindo a qualquer singleton, e não apenas None
.
... para comparar singletons como Nenhum. O uso é ou não é.
python
coding-style
boolean-expression
orokusaki
fonte
fonte
is not
é um operador por si só. Like!=
. Se você preferirnot x is None
, também deve preferirnot a == b
terminara != b
.not x is None
(as respostas aqui me convenceram) - no entanto, vale a pena notar que essenot a == b
é o estilo preferido em Python, em comparação coma != b
.not a == b
realmente o estilo preferido? Eu nunca vi isso assim e em todos os lugares que olho as pessoas usam!=
.!=
em vez de dois operadoresnot
,==
.Respostas:
Não há diferença de desempenho, pois eles são compilados no mesmo bytecode:
Estilisticamente, tento evitar
not x is y
. Embora o compilador sempre o trate comonot (x is y)
, um leitor humano pode entender mal o construto como(not x) is y
. Se eu escrevox is not y
, não há ambiguidade.fonte
x is (not y)
. Mas eu tendem a concordar com você pelo seu outro raciocínio.O guia de estilo do Google e do Python é a melhor prática:
O uso
not x
pode causar resultados indesejados.Ver abaixo:
Você pode estar interessado em ver quais literais são avaliados
True
ouFalse
no Python:Edite para comentar abaixo:
Acabei de fazer mais alguns testes.
not x is None
não negax
primeiro e depois comparado aNone
. De fato, parece que ois
operador tem uma precedência mais alta quando usado dessa maneira:Portanto,
not x is None
é apenas, na minha opinião honesta, melhor evitado.Mais editar:
Acabei de fazer mais testes e posso confirmar que o comentário do bukzor está correto. (Pelo menos, não consegui provar o contrário.)
Isso significa que
if x is not None
tem o resultado exato comoif not x is None
. Eu estou corrigido. Obrigado bukzor.No entanto, minha resposta ainda permanece: use o convencional
if x is not None
.:]
fonte
O código deve ser escrito para ser compreensível para o programador primeiro e o compilador ou intérprete segundo. A construção "não é" se parece mais com o inglês do que "não é".
fonte
TLDR: O compilador de bytecode analisa os dois para
x is not None
- portanto, para facilitar a leitura, useif x is not None
.Legibilidade
Usamos o Python porque valorizamos coisas como legibilidade humana, usabilidade e correção de vários paradigmas de programação sobre desempenho.
O Python otimiza a legibilidade, especialmente neste contexto.
Analisando e compilando o bytecode
Os
not
vínculos são mais fracos queis
, portanto, não há diferença lógica aqui. Veja a documentação :O
is not
é especificamente fornecido na gramática Python como uma melhoria de legibilidade para a linguagem:E, portanto, também é um elemento unitário da gramática.
Obviamente, não é analisado da mesma forma:
Mas o compilador de bytes converterá realmente o
not ... is
parais not
:Portanto, para facilitar a leitura e usar o idioma como pretendido, use
is not
.Para não usá-lo, não é sábio.
fonte
not
vínculos são mais fracos queis
, portanto, não há diferença lógica aqui" - exceto que o Python não precisa impor identidades lógicas e algébricas para manter (nenhuma razão intrínseca para(1 + 2)*3
avaliar o mesmo que1*3 + 2*3
). Aqui, aparentemente, o Python está trapaceando e otimizandoUNARY_NOT
.A resposta é mais simples do que as pessoas estão fazendo.
De qualquer maneira, não há vantagem técnica, e "x não é y" é o que todo mundo usa , o que o torna claramente o vencedor. Não importa que "pareça mais com o inglês" ou não; todo mundo usa, o que significa que todos os usuários do Python - mesmo os usuários chineses, cuja linguagem o Python não se parece - entenderão rapidamente, onde a sintaxe um pouco menos comum precisará de alguns ciclos cerebrais extras para analisar.
Não seja diferente apenas por ser diferente, pelo menos neste campo.
fonte
O
is not
operador é preferível a negar o resultadois
por razões estilísticas. "if x is not None:
" lê como o inglês, mas "if not x is None:
" requer entendimento da precedência do operador e não como o inglês.Se houver uma diferença de desempenho, meu dinheiro estará gasto
is not
, mas essa certamente não é a motivação para a decisão de preferir essa técnica. Obviamente, seria dependente da implementação. Comois
não é substituível, deve ser fácil otimizar qualquer distinção de qualquer maneira.fonte
Pessoalmente, eu uso
que é entendido imediatamente sem ambiguidade por todo programador, mesmo aqueles que não são especialistas na sintaxe do Python.
fonte
if not x is None
é mais parecido com outras linguagens de programação, masif x is not None
definitivamente parece mais claro (e é mais gramaticalmente correto em inglês) para mim.Dito isto, parece que é mais uma coisa de preferência para mim.
fonte
Eu preferiria a forma mais legível
x is not y
do que pensaria como escrever a precedência de manipulação de código dos operadores para produzir um código muito mais legível.fonte