python3 examples all python boolean

examples - ¿Hay algún uso legítimo de list[True], list[False] en Python?



any python examples (3)

Como True y False son instancias de int , lo siguiente es válido en Python:

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

Entiendo por qué sucede esto. Sin embargo, encuentro este comportamiento un poco inesperado y puede llevar a errores difíciles de depurar. Ciertamente me ha mordido un par de veces.

¿Alguien puede pensar en un uso legítimo de las listas de indexación con True o False ?


A menudo hay mejores formas, pero los índices Booleanos sí tienen sus usos. Los he usado cuando quiero convertir un resultado booleano en algo más legible para los humanos:

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


En el pasado, algunas personas han usado este comportamiento para producir la expresión condicional de un hombre pobre:

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

Sin embargo, con una expresión condicional apropiada que se ha agregado al lenguaje en Python 2.5, esto está muy mal visto, por las razones que usted declara: confiar en que los booleanos son una subclase de enteros es demasiado ''mágico'' e ilegible para un mantenedor.

Por lo tanto, a menos que tenga código de golf (produciendo deliberadamente código muy compacto y oscuro), use

''bar'' if eggs > 5 else ''foo''

en su lugar, que tiene la ventaja adicional de que las dos expresiones que selecciona entre se evalúan de forma perezosa ; si eggs > 5 es falso, la expresión before the if nunca se ejecuta.


Si está perplejo, por qué bool es un argumento de índice válido: esto es simplemente por coherencia con el hecho de que bool es una subclase de int y en Python es un tipo numérico.

Si estás preguntando por qué bool es un tipo numérico en primer lugar, entonces tienes que entender que bool no estaba presente en las versiones anteriores de Python y la gente usa int s en su lugar.

Agregaré un poco de argumentos históricos. En primer lugar, la adición de bool en python se describe brevemente en el blogpost de Guido van Rossum (también conocido como BDFL): The History of Python: The history of bool , True and False . El tipo fue agregado a través de PEP 285 .

El PEP contiene los fundamentos reales utilizados para estas decisiones. Citaré algunas de las partes del PEP a continuación.

4) ¿Deberíamos esforzarnos por eliminar operaciones no booleanas en bools en el futuro, a través de advertencias adecuadas, de modo que, por ejemplo, True+1 eventualmente (en Python 3000) sea ilegal?

=> No.

Hay una minoría pequeña pero vocal que preferiría ver bools de "libros de texto" que no admitan operaciones aritméticas en absoluto, pero la mayoría de los revisores están de acuerdo conmigo en que los bools siempre deberían permitir operaciones aritméticas.

6) ¿Debería bool heredar de int ?

=> Sí.

En un mundo ideal, bool podría implementarse mejor como un tipo de entero separado que sabe cómo realizar aritmética de modo mixto. Sin embargo, heredar bool de int facilita enormemente la implementación (en parte debido a que todo el código C que llama a PyInt_Check() continuará funcionando, esto devuelve true para las subclases de int ). Además, creo que esto es correcto en términos de sustituibilidad: el código que requiere un int se puede alimentar con un bool y se comportará igual que 0 o 1 . El código que requiere un bool puede no funcionar cuando se le da un int ; por ejemplo, 3 y 4 es 0, pero tanto 3 como 4 son verdaderos cuando se consideran valores de verdad.

Como bool hereda de int , True+1 es válido y es igual a 2 , y así sucesivamente. Esto es importante para la compatibilidad con versiones anteriores : debido a que las comparaciones y demás actualmente devuelven valores enteros, no hay forma de decir qué hacen las aplicaciones existentes con estos valores.

Debido a la compatibilidad con versiones anteriores , el tipo bool carece de muchas propiedades que a algunos les gustaría ver. Por ejemplo, se permiten operaciones aritméticas con uno o dos argumentos bool, tratando a False como 0 y Verdadero como 1. Además, se puede usar un bool como índice de secuencia.

No veo esto como un problema, y ​​tampoco quiero evolucionar el lenguaje en esta dirección. No creo que una interpretación más estricta de "Booleanness" aclare el lenguaje.

Resumen :

  • Compatibilidad con versiones anteriores: había muchos códigos que ya utilizaban int s 0 y 1 para representar False y True y algunos de ellos usaban esos valores en cálculos numéricos.
  • No se consideraba un gran problema tener un tipo de bool "sin libros de texto"
  • Mucha gente en la comunidad de Python quería estas características
  • BDFL lo dijo.