¿Es Pythonic usar bools como enteros?
False
es equivalente a 0
y True
es equivalente 1
por lo que es posible hacer algo como esto:
def bool_to_str(value):
"""value should be a bool"""
return ['No', 'Yes'][value]
bool_to_str(True)
Observe cómo value es bool
pero se usa como int
.
¿Es este tipo de uso Pythonic o debería evitarse?
Seré la voz extraña (ya que todas las respuestas denuncian el uso del hecho de que False == 0
y True == 1
, como garantiza el lenguaje) ya que afirmo que el uso de este hecho para simplificar su código está perfectamente bien.
Históricamente, las operaciones lógicas verdadero/falso tendían a usarse simplemente 0
para falso y 1
verdadero; En el transcurso del ciclo de vida de Python 2.2, Guido notó que demasiados módulos comenzaban con tareas como false = 0; true = 1
y esto producía variaciones repetitivas y inútiles (esta última porque las mayúsculas de verdadero y falso estaban por todas partes; algunos usaban todo -mayúsculas, algunas en minúsculas, otras con inicial de mayúscula) y así introdujo la bool
subclase de int
and its True
y False
constantes.
Hubo bastante rechazo en ese momento, ya que muchos de nosotros temíamos que los nuevos tipos y constantes fueran utilizados por los novatos de Python para restringir las capacidades del lenguaje, pero Guido insistió en que estábamos siendo pesimistas: nadie entendería Python tan mal. por ejemplo, para evitar el uso perfectamente natural de False
y True
como índices de lista, o en una suma, u otros modismos perfectamente claros y útiles.
Las respuestas a este hilo demuestran que teníamos razón: como temíamos, ha surgido un malentendido total de los roles de este tipo y las constantes, y la gente está evitando, y, ¡peor!, instando a otros a evitar, construcciones de Python perfectamente naturales en favor de giros inútiles.
Luchando contra la corriente de tales malentendidos, insto a todos a usar Python como Python , sin intentar forzarlo a adaptarse al molde de otros lenguajes cuya funcionalidad y estilo preferido son bastante diferentes. En Python , Verdadero y Falso son 99,9% como 1 y 0, diferenciándose exclusivamente en su str(...)
(y por lo tanto repr(...)
) forma; para cualquier otra operación excepto la encadenación, siéntase libre de usarlos sin contorsiones. Eso se aplica a la indexación, la aritmética, las operaciones de bits, etc, etc, etc.
Estoy con Alex. False==0
y True==1
y no hay nada de malo en eso.
Aún así, en Python 2.5 y posteriores escribiría la respuesta a esta pregunta en particular usando la expresión condicional de Python:
def bool_to_str(value):
return 'Yes' if value else 'No'
De esa manera, no es necesario que el argumento sea realmente un bool; así como if x: ...
acepta cualquier tipo for x
, la bool_to_str()
función debe hacer lo correcto cuando se le pasa Ninguno, una cadena, una lista o 3.14.
seguramente:
def bool_to_str(value):
"value should be a bool"
return 'Yes' if value else 'No'
es más legible.