38 votes

Existe-t-il un usage légitime de list [True], list [False] en Python?

Puisque True et False sont des instances de int , les éléments suivants sont valables en Python:

 >>> l = [0, 1, 2]
>>> l[False]
0
>>> l[True]
1
 

Je comprends pourquoi cela se produit. Cependant, je trouve ce comportement un peu inattendu et peut conduire à des bogues difficiles à déboguer. Cela m’a certainement mordu plusieurs fois.

Quelqu'un peut-il penser à une utilisation légitime des listes d'indexation avec True ou False ?

60voto

Martijn Pieters Points 271458

Dans le passé, certaines personnes ont utilisé ce comportement pour produire un pauvre de l' expression conditionnelle:

['foo', 'bar'][eggs > 5]  # produces 'bar' when eggs is 6 or higher, 'foo' otherwise

Cependant, avec une bonne expression conditionnelle ayant été ajoutés à la langue dans Python 2.5, ce qui est très mal vu, pour les raisons que vous avez de l'état: en s'appuyant sur les booléens étant une sous-classe de nombres entiers est trop "magique" et illisible pour un responsable.

Donc, sauf si vous êtes du code de golf (délibérément, la production est très compact et obscur code), l'utilisation

'bar' if eggs > 5 else 'foo'

au lieu de cela, ce qui a l'avantage que les deux expressions de cette sélectionne entre sont paresseusement évaluée; si eggs > 5 est faux, l'expression avant de l' if n'est jamais exécutée.

35voto

Bakuriu Points 22607

Si vous êtes perplexe pourquoi bool est un index valide l'argument: c'est simplement pour la cohérence avec le fait qu' bool est une sous-classe de int et en Python c' est un type numérique.

Si vous vous demandez pourquoi bool est un type numérique, en premier lieu, alors vous devez comprendre que bool n'était pas présent dans les anciennes versions de Python et les gens utilisaient ints à la place.

Je vais ajouter un peu d'arguments historiques. Tout d'abord l'ajout d' bool en python est peu décrit dans Guido van Rossum (aka BDFL) article sur le blog: L'Histoire de Python: l'histoire de L' bool, True et False. Le type a été ajoutée par PEP 285.

Le PEP contient les réelles justifications utilisées pour ces décisions. Je vais citer quelques-unes des parties de la PEP ci-dessous.

4) Doit-on s'efforcer d'éliminer les non-opérations Booléennes sur des booléens dans l'avenir, à travers des avertissements adéquats, de sorte que, par exemple, True+1 serait finalement (en Python 3000) être illégal?

=> Non.

Il y a un petit mais la minorité qui préférerait le voir "manuel" bool qui ne prennent pas en charge les opérations arithmétiques à tous, mais la plupart des commentateurs sont d'accord avec moi que booléens doivent toujours permettre les opérations arithmétiques.


6) bool hériter d' int?

=> Oui.

Dans un monde idéal, bool peut-être mieux mis en œuvre comme un séparé de type integer qui sait comment effectuer en mode mixte l'arithmétique. Cependant, héritant bool de int facilite l' la mise en œuvre énormément(en partie car tous les code C qui appelle PyInt_Check() continuera de travailler -- renvoie true pour les sous-classes d' int). Aussi, je crois que c'est juste en termes de substituabilité: le code qui implique un int peuvent être nourris avec un bool et il se comporte comme 0 ou 1. Code qui nécessite une bool peut ne pas fonctionner lorsqu'il est donné un int; par exemple, 3 & 4 est 0, mais la 3 et 4 sont vraies quand on la considère comme la vérité des valeurs.


Parce qu' bool hérite int, True+1 est valide et correspond 2, et ainsi de suite. Ceci est important pour assurer la compatibilité ascendante: parce que les comparaisons et donc sur le retour des valeurs entières, il n'y a pas façon de dire quelles sont les utilisations des applications existantes de ces des valeurs.


En raison de la compatibilité, le type bool manque beaucoup les propriétés que certains aimeraient voir. Par exemple, l'arithmétique les opérations avec un ou deux bool arguments est autorisé, le traitement de l' Faux comme 0 et Vrai 1. Aussi, un booléen peut être utilisé comme une séquence index.

Je ne vois pas cela comme un problème, et je ne veux pas faire évoluer le langue dans cette direction aussi. Je ne crois pas qu'une interprétation plus restrictive de "Booleanness" fait la langue toute plus claire.


Résumé:

  • Rétro-compatibilité: il y avait beaucoup de code déjà utilisé ints 0 et 1 pour représenter False et True et certains il a utilisé ces valeurs dans les calculs numériques.
  • Il n'était pas vu comme une grande affaire pour avoir un "non-manuels" bool type
  • Beaucoup de gens dans la communauté Python voulais que ces caractéristiques
  • BDFL l'a dit.

4voto

JS. Points 1964

Il y a souvent de meilleurs moyens, mais les indices booléens ont leur utilité. Je les ai utilisées quand je veux convertir un résultat booléen en quelque chose de plus lisible par l'homme:

 test_result = run_test()
log.info("The test %s." % ('Failed', 'Passed')[test_result])
 

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