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 deint
?=> 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, heredarbool
deint
facilita enormemente la implementación (en parte debido a que todo el código C que llama aPyInt_Check()
continuará funcionando, esto devuelve true para las subclases deint
). Además, creo que esto es correcto en términos de sustituibilidad: el código que requiere unint
se puede alimentar con unbool
y se comportará igual que0
o1
. El código que requiere unbool
puede no funcionar cuando se le da unint
; por ejemplo, 3 y 4 es 0, pero tanto 3 como 4 son verdaderos cuando se consideran valores de verdad.
Como
bool
hereda deint
,True+1
es válido y es igual a2
, 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
s0
y1
para representarFalse
yTrue
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.