¿Es Pythonic usar bools como enteros?

Resuelto hwiechers asked hace 14 años • 7 respuestas

Falsees equivalente a 0y Truees equivalente 1por 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 boolpero se usa como int.

¿Es este tipo de uso Pythonic o debería evitarse?

hwiechers avatar Jul 04 '10 17:07 hwiechers
Aceptado

Seré la voz extraña (ya que todas las respuestas denuncian el uso del hecho de que False == 0y 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 0para falso y 1verdadero; En el transcurso del ciclo de vida de Python 2.2, Guido notó que demasiados módulos comenzaban con tareas como false = 0; true = 1y 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 boolsubclase de intand its Truey Falseconstantes.

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 Falsey Truecomo í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.

Alex Martelli avatar Jul 04 '2010 16:07 Alex Martelli

Estoy con Alex. False==0y True==1y 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.

Guido van Rossum avatar Jul 28 '2011 21:07 Guido van Rossum

seguramente:

def bool_to_str(value):
    "value should be a bool"
    return 'Yes' if value else 'No'

es más legible.

SilentGhost avatar Jul 04 '2010 10:07 SilentGhost