75 votes

Est-ce que tout est plus grand que rien ?

Existe-t-il un type de données intégré à Python ? en plus de None pour lequel :

>>> not foo > None
True

foo est une valeur de ce type ? Que pensez-vous de Python 3 ?

96voto

John Feminella Points 116878

None est toujours inférieur à n'importe quel type de données en Python 2 (cf. object.c ).

Dans Python 3, cela a été modifié ; maintenant, faire des comparaisons sur des éléments sans ordre naturel raisonnable donne lieu à un problème de type TypeError . De la 3.0 mises à jour "Quoi de neuf ? :

Python 3.0 a simplifié les règles d'ordonnancement des comparaisons :

Les opérateurs de comparaison d'ordre ( < , <= , >= , > ) soulève un TypeError exception lorsque les opérandes n'ont pas d'ordre naturel significatif. Ainsi, des expressions comme : 1 < '' , 0 > None ou len <= len ne sont plus valables, et par exemple None < None soulève TypeError au lieu de renvoyer False . Un corollaire est que le tri d'une liste hétérogène n'a plus de sens - tous les éléments doivent être comparables les uns aux autres. Notez que cela ne s'applique pas à la == et != opérateurs : les objets de types différents incomparables se comparent toujours de manière inégale.

Cela a contrarié certaines personnes, car il était souvent pratique de faire des choses comme trier une liste qui avait des None dans celui-ci, et avoir le None apparaissent regroupées au début ou à la fin. Il y a eu un fil de discussion sur la liste de diffusion à ce sujet. Il y a quelque temps, mais le point essentiel est que Python 3 essaie d'éviter de prendre des décisions arbitraires concernant l'ordonnancement (ce qui était souvent le cas dans Python 2).

1 votes

Merci de clarifier l'état de Python 3. Je me souviens avoir lu la page "what's new" mais je ne me souviens pas de celle-ci. Très intéressant, mais cela a du sens en effet...

2 votes

Bien sûr, il n'y a rien d'arbitraire à ordonner Aucun, tant qu'il est clairement défini. Ce genre d'incompatibilité gratuite est la raison pour laquelle l'adoption de Python 3 prend autant de temps.

14 votes

"Bien défini" (définition claire et explicite d'un comportement) est distinct de "arbitraire" (choix fait sur la base de la discrétion). Par exemple, on aurait pu tout aussi bien dire "Aucun ne se compare à tout". C'est tout aussi bien défini, mais encore très arbitraire.

30voto

Torsten Marek Points 27554

Du Python 2.7.5 source ( object.c ) :

static int
default_3way_compare(PyObject *v, PyObject *w)
{
    ...
    /* None is smaller than anything */
    if (v == Py_None)
            return -1;
    if (w == Py_None)
            return 1;
    ...
}

EDIT : Ajout du numéro de version.

2 votes

Je suppose que c'est pour Python 2.x ?

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