J'ai toujours pensé que la if not x is None
version était plus claire, mais le guide de style de Google et le PEP-8 utilisent tous les deux if x is not None
. Y a-t-il une différence de performance mineure (je suppose que non), et y a-t-il un cas où l'un ne correspond vraiment pas (faisant de l'autre un gagnant clair pour ma convention)? *
* Je fais référence à n'importe quel singleton, plutôt que juste None
.
... pour comparer des singletons comme None. L'utilisation est ou n'est pas.
python
coding-style
boolean-expression
orokusaki
la source
la source
is not
est un opérateur à part entière. Comme!=
. Si vous préféreznot x is None
, votre devrait aussi préférernot a == b
plusa != b
.not x is None
(les réponses ici m'ont convaincu) - il convient cependant de noter quenot a == b
c'est le style préféré en Python par rapport àa != b
.not a == b
vraiment le style préféré? Je ne l'ai jamais vu faire de cette façon et partout où je regarde les gens utilisent tous!=
.!=
lieu de deux opérateursnot
,==
.Réponses:
Il n'y a aucune différence de performances, car ils se compilent dans le même bytecode:
Stylistiquement, j'essaye d'éviter
not x is y
. Bien que le compilateur le traite toujours commenot (x is y)
, un lecteur humain peut mal comprendre la construction comme(not x) is y
. Si j'écris,x is not y
il n'y a pas d'ambiguïté.la source
x is (not y)
. Mais j'ai tendance à être d'accord avec vous pour votre autre raisonnement.Le guide de style de Google et de Python est la meilleure pratique:
L'utilisation
not x
peut entraîner des résultats indésirables.Voir ci-dessous:
Vous pourriez être intéressé de voir quels littéraux sont évalués sur
True
ouFalse
en Python:Modifier pour le commentaire ci-dessous:
Je viens de faire quelques tests supplémentaires.
not x is None
ne nie pas d'x
abord, puis par rapport àNone
. En fait, il semble que l'is
opérateur ait une priorité plus élevée lorsqu'il est utilisé de cette façon:Par conséquent, il
not x is None
est, à mon avis honnête, préférable d'éviter.Plus modifier:
Je viens de faire plus de tests et je peux confirmer que le commentaire de bukzor est correct. (Au moins, je n'ai pas pu prouver le contraire.)
Cela signifie que
if x is not None
le résultat exact estif not x is None
. Je me suis trompé. Merci bukzor.Cependant, ma réponse est toujours valable: utilisez le conventionnel
if x is not None
.:]
la source
Le code doit être écrit pour être compréhensible par le programmeur en premier, et le compilateur ou l'interpréteur en second. La construction "is not" ressemble plus à l'anglais que "not is".
la source
TLDR: le compilateur de bytecode les analyse tous les deux
x is not None
- donc pour des raisons de lisibilité, utilisezif x is not None
.Lisibilité
Nous utilisons Python parce que nous apprécions des choses comme la lisibilité humaine, l'utilisabilité et l'exactitude de divers paradigmes de programmation par rapport aux performances.
Python optimise la lisibilité, en particulier dans ce contexte.
Analyse et compilation du Bytecode
La
not
liaison est plus faible queis
, il n'y a donc pas de différence logique ici. Consultez la documentation :Le
is not
est spécifiquement prévu dans la grammaire Python comme une amélioration de la lisibilité du langage:Et c'est donc aussi un élément unitaire de la grammaire.
Bien sûr, ce n'est pas pareil:
Mais le compilateur octet fait traduire
not ... is
àis not
:Donc, pour des raisons de lisibilité et d'utilisation de la langue comme prévu, veuillez utiliser
is not
.Ne pas l'utiliser n'est pas sage.
la source
not
lien est plus faible queis
, donc il n'y a pas de différence logique ici" - sauf que Python n'a pas à imposer les identités logiques et algébriques (aucune raison intrinsèque pour(1 + 2)*3
évaluer la même chose que1*3 + 2*3
). Ici, apparemment, Python triche et s'optimiseUNARY_NOT
.La réponse est plus simple que les gens ne le font.
Il n'y a aucun avantage technique de toute façon, et "x n'est pas y" est ce que tout le monde utilise , ce qui en fait le vainqueur incontestable. Peu importe qu'il "ressemble plus à l'anglais" ou non; tout le monde l'utilise, ce qui signifie que chaque utilisateur de Python - même les utilisateurs chinois, dont le langage Python ne ressemble en rien - le comprendra d'un coup d'œil, où la syntaxe légèrement moins courante prendra quelques cycles cérébraux supplémentaires à analyser.
Ne soyez pas différent juste pour être différent, au moins dans ce domaine.
la source
L'
is not
opérateur est préférable à la négation du résultatis
pour des raisons stylistiques. "if x is not None:
" se lit comme l'anglais, mais "if not x is None:
" nécessite la compréhension de la priorité de l'opérateur et ne se lit pas comme l'anglais.S'il y a une différence de performance, mon argent est en jeu
is not
, mais ce n'est certainement pas la motivation pour la décision de préférer cette technique. Cela dépendrait évidemment de la mise en œuvre. Comme ilis
n'est pas possible de le remplacer, il devrait être facile d'optimiser n'importe quelle distinction de toute façon.la source
Personnellement, j'utilise
ce qui est compris immédiatement et sans ambiguïté par tous les programmeurs, même ceux qui ne sont pas experts en syntaxe Python.
la source
if not x is None
est plus similaire aux autres langages de programmation, maisif x is not None
sonne définitivement plus clair (et est plus grammaticalement correct en anglais) pour moi.Cela dit, il semble que ce soit plus une préférence pour moi.
la source
Je préférerais la forme plus lisible
x is not y
que je ne pense comment écrire éventuellement la priorité de gestion du code des opérateurs afin de produire un code beaucoup plus lisible.la source