924 votes

Python `si x n'est pas None` ou` sinon x est None`?

J'ai toujours pensé de l' if not x is None version plus claire, mais Google guide de style implique (basé sur cette extrait) qu'ils utilisent if x is not None. Est-il mineur différence de performances (je suppose que non), et est-il un cas où l'on n'a pas vraiment d'ajustement (faisant de l'autre un gagnant clair pour ma convention)?*

*Je fais référence à tout singleton, plutôt que de simplement en None.

...de comparer les singletons comme Aucun. L'utilisation est ou n'est pas.

1201voto

Daniel Stutzbach Points 20026

Il n'y a pas de différence de performance, car ils compilent au même bytecode:

 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
 

Stylistiquement, j'essaie d'éviter not x is y . Bien que le compilateur le traite toujours comme not (x is y) , un lecteur humain peut mal comprendre la construction en (not x) is y . Si j'écris x is not y alors il n'y a pas d'ambiguïté.

355voto

Xavier Ho Points 4631

À la fois Google et Python's style guide est la meilleure pratique:

if x is not None:
    # Do something about x

À l'aide de not x peut causer des résultats indésirables. Voir ci-dessous:

>>> 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

Vous pouvez être intéressé de voir ce que les littéraux sont évalués à l' True ou False Python:

Edit de commentaire ci-dessous:

Je viens de faire quelques tests supplémentaires. not x n'est ne pas nier x d'abord et puis par rapport au None. En fait, il semble que l' is opérateur a une priorité plus élevée lorsque utilisé de cette façon:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False

Par conséquent, not x is None est juste, à mon avis honnête, vaut mieux l'éviter.

Plus edit:

Je viens de faire plusieurs tests et je peux confirmer que bukzor commentaire est correct. (Au moins, je n'étais pas en mesure de prouver le contraire.)

Cela signifie if x is not None a exactement le résultat que l' if not x is None. Je corrige la position des mains. Grâce bukzor.

Cependant, ma réponse est toujours debout: Utiliser le conventionnel if x is not None. :]

139voto

Mark Ransom Points 132545

Le code doit être écrit pour être compréhensible par le programmeur d'abord, et le compilateur ou l'interprète ensuite. La construction "is not" ressemble plus à l'anglais qu'à "not is".

32voto

Glenn Maynard Points 24451

La réponse est plus simple que ce que les gens font.

Il n'y a aucun avantage technique de toute façon, et "x est y" est ce que tout le monde utilise, ce qui en fait le gagnant clair. Il n'a pas d'importance qu'il "ressemble plus à anglais" ou pas; 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--de se comprendre en un coup d'œil, où le légèrement moins fréquente de la syntaxe de prendre un couple supplémentaire cerveau cycles à analyser.

Ne pas être différent juste pour le plaisir d'être différent, au moins dans ce domaine.

11voto

Mike Graham Points 22480

L' is not opérateur est préféré au cours de nier le résultat d' is pour des raisons de style. "if x is not None:", lit-tout comme l'anglais, mais "if not x is None:" exige une compréhension de la priorité de l'opérateur et ne lisait pas l'anglais.

Si il y a une différence de performance de mon argent est sur is not, mais presque certainement n'est pas la motivation de la décision de préférer cette technique. Il serait, bien sûr, dépend de l'implémentation. Depuis is n'est pas substituables, il devrait être facile à optimiser toute distinction de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X