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


J'ai toujours pensé au if not x is None version pour être plus clair, mais Google guide de style et PEP-8 les deux utilisent if x is not None. Y a-t-il une différence de performance mineure (je ne le suppose pas), et y a-t-il un cas où l'un ne convient pas vraiment (ce qui fait de l'autre un gagnant clair pour ma convention)? *

* Je parle de tout singleton, plutôt que juste None.

... pour comparer des singletons comme   Aucun. L'utilisation est ou n'est pas.


514
2018-04-26 03:10


origine


Réponses:


Il n'y a pas de différence de performance, car ils sont compilés dans le 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 traitera toujours comme not (x is y), un lecteur humain pourrait mal comprendre la construction comme (not x) is y. Si j'écris x is not y alors il n'y a pas d'ambiguïté.


780
2018-04-26 03:55



Google et Google PythonLe guide de style est la meilleure pratique:

if x is not None:
    # Do something about x

En utilisant not x peut provoquer 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 pourriez être intéressé de voir quels littéraux sont évalués True ou False en Python:

Modifier pour commenter ci-dessous: 

Je viens de faire d'autres tests. not x est Aucune ne nie x d'abord, puis comparé à None. En fait, il semble que is l'opérateur a une priorité plus élevée lorsqu'il est utilisé de cette façon:

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

Donc, not x is None est juste, à mon avis honnête, mieux évité.

Plus d'édition:

je viens de faire plus test et peut confirmer que le commentaire de bukzor est correct. (Au moins, je n'ai pas pu le prouver autrement.)

Ça signifie if x is not None a le résultat exact if not x is None. Je me suis trompé. Merci bukzor.

Cependant, ma réponse est toujours la suivante: Utilisez le classique if x is not None. :]


117
2018-04-26 03:13



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


112
2018-04-26 03:15



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 gagnant clair. Peu importe que "ça ressemble plus à l'anglais" ou pas; tout le monde l'utilise, ce qui signifie que chaque utilisateur de Python - même les utilisateurs chinois, dont la langue Python ne ressemble à rien - le comprendra d'un coup d'œil, où la syntaxe légèrement moins commune nécessitera quelques cycles supplémentaires.

Ne sois pas différent juste pour être différent, au moins dans ce domaine.


26
2018-04-26 07:18



Python if x is not None ou if not x is None?

TLDR: le compilateur bytecode les analyse à la fois pour x is not None - Donc, pour des raisons de lisibilité, utilisez if x is not None.

Lisibilité

Nous utilisons Python parce que nous évaluons des choses comme la lisibilité humaine, l'utilisabilité et la justesse des différents paradigmes de la programmation par rapport aux performances.

Python optimise la lisibilité, surtout dans ce contexte.

Analyse et compilation du bytecode

le not  lie plus faiblement que is, donc il n'y a pas de différence logique ici. Voir le Documentation:

Les opérateurs is et is not test d'identité d'objet: x is y est vrai   si et seulement si x et y sont le même objet. x is not y donne le   valeur de vérité inverse.

le is not est spécifiquement prévu dans le Python grammaire comme une amélioration de la lisibilité pour la langue:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

Et c'est donc un élément unitaire de la grammaire.

Bien sûr, il n'est pas analysé de la même façon:

>>> 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())]))"

Mais alors le compilateur d'octets traduira réellement le 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

Donc, par souci de lisibilité et en utilisant le langage tel qu'il était prévu, veuillez utiliser is not.

Ne pas l'utiliser n'est pas sage.


14
2017-07-20 16:18



le is not l'opérateur est préféré à la négation du résultat de is pour des raisons stylistiques. "if x is not None:"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 sur 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. Depuis is n'est pas prioritaire, il devrait être facile d'optimiser toute distinction de toute façon.


8
2018-04-26 04:32



Personnellement, j'utilise

if not (x is None):

ce qui est compris immédiatement sans ambiguïté par tous les programmeurs, même ceux qui ne sont pas experts en syntaxe Python.


4
2018-06-26 16:14



if not x is None est plus similaire à d'autres langages de programmation, mais if x is not None Semble clairement 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.


1
2018-04-26 03:14



Je préférerais la forme plus lisible x is not y que je penserais comment éventuellement écrire le code de gestion de la priorité des opérateurs afin de produire un code beaucoup plus lisible.


0
2017-09-24 07:19