2 votes

Pourquoi bool est une sous-classe de int dans Python 3 ?

Depuis l'introduction de la bool il s'agit d'une sous-classe de int et les bools peuvent être convertis en entiers de manière implicite :

>>> issubclass(bool, int)
True
>>> ['one', 'two'][False]
'one'
>>> ['one', 'two'][True]
'two'
>>> True/20
0.05

C'était pour des raisons historiques : la compatibilité avec les API antérieures à la version 2.3 ; et je crois savoir qu'elle a été conservée de la version 2.3 à la version 2.7. (Ce problème a été résolu dans la version 2.7. cette question à partir de 2011)

Cependant, pourquoi est-ce toujours vrai dans Python 3 ? Je n'y vois aucun avantage. Et il n'y a aucune raison de le conserver pour la rétrocompatibilité : Python 3.0 était une version de rupture ; et je ne pense pas que les API antérieures à la version 2.3 existent encore de toute façon.

8voto

user2357112 Points 37737

De la original bool PEP :

Doit-on s'efforcer d'éliminer les opérations non booléennes sur les bools dans le fichier l'avenir, par le biais d'avertissements appropriés, de sorte que, par exemple, True+1 serait éventuellement (dans Python 3000) être illégal ?

\=> Non.

Il y a une petite minorité qui préférerait voir des bools "textbook" qui ne prennent pas en charge le support de l'interface. bools qui ne supportent pas du tout les opérations arithmétiques, mais la plupart des critiques sont d'accord avec moi pour dire que les bools devraient toujours permettre les arithmétiques.

Et plus loin dans le même document :

Pour des raisons de rétrocompatibilité, le type bool est dépourvu de beaucoup de propriétés que certains aimeraient voir. Par exemple, les opérations arithmétiques avec un ou deux arguments bool est autorisée, en traitant False comme 0 et True comme 1. comme 0 et Vrai comme 1. De plus, un bool peut être utilisé comme un index de séquence.

Je ne vois pas cela comme un problème, et je ne veux pas faire évoluer le langage dans cette direction non plus. Je ne crois pas qu'une interprétation plus stricte de "Booleanness" rend le langage plus clair.

La suppression de bools-as-numbers n'était pas une orientation linguistique prévue. Guido ne pensait pas que cela rendrait le langage meilleur.

1voto

Terry Jan Reedy Points 441

Exemple d'utilité : Les deux valeurs booléennes 0, False et 1, True peut représenter les 2 parties de n'importe quelle partition binaire. Supposons que n personnes répondent à m questions et que leur réponse à chaque question soit étiquetée "échec" ou "réussite". Nous créons un tableau de données avec n lignes et m (+1, pour l'identification) colonnes et codons échec/réussite comme 0/1. Nous pouvons ensuite compter les succès pour chaque question en additionnant les lignes et les succès pour chaque question en additionnant les colonnes. Tout logiciel d'analyse digne de ce nom devrait être capable de faire cela avec peu ou pas de programmation personnalisée.

Développement Python 3 : J'ai participé à la discussion et je suis sûr qu'il y a eu beaucoup plus de propositions de rupture de compatibilité rejetées que d'acceptées. Chaque changement devait être rentable.

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