2010-09-10 20 views
5

¿Cuál es la mejor manera de hacer que una variable que funciona exactamente igual que un bool pero no se imprime o OnOff en lugar de True o False? Actualmente el programa está imprimiendo: Color: True, mientras que Color: On tendría más sentido.Python bool de impresión 'On' u 'Off' en lugar de 'Verdadero' o 'Falso'

Para el registro, que inicialmente trató de hacer una clase OnOff que hereda de bool:

class OnOff(bool): 
    def __str__(self): 
     if self: return 'On' 
     else: return 'Off' 

De los comentarios, ahora entiendo que bool es un producto único, por lo que este fracasado estrepitosamente:

Traceback (most recent call last): 
    class OnOff(bool): 
TypeError: Error when calling the metaclass bases 
    type 'bool' is not an acceptable base type 
+0

Se puede publicar código? –

+0

No creo que el código sea relevante para el problema: solo quiero hacer una variable que actúe exactamente como un bool, pero imprime 'On' y' Off' en lugar de 'True' o' False'. – Zaz

+3

@Josh: Esto no es "hacer mi tarea para me.com". Por favor, publique el código que intentó para que podamos ver cuál es su nivel de comprensión. –

Respuesta

17

print ("Off", "On")[value] obras también (debido (False, True) == (0,1))

4
print "On" if color else "Off" # Python 2.x 
print ("On" if color else "Off") # Python 3.x 
+0

La instrucción print está dentro de una clase que pasa por encima de variables externas, por lo que no es muy práctico. – Zaz

+0

¿No debería funcionar el ejemplo inferior tanto en 2.x como en 3.x? –

10
def Color(object): 

    def __init__(self, color_value=False): 
     self.color_value = color_value 

    def __str__(self): 
     if self.color_value: 
      return 'On' 
     else: 
      return 'Off' 

    def __cmp__(self, other): 
     return self.color_value.__cmp__(other.color_value) 

Aunque esto podría ser excesivo para ti. :)

+0

Esta es la mejor solución hasta ahora, pero esa clase no funcionará como un bool normal en absoluto. – Zaz

+0

Si desea que funcione como un bool normal, anule el método __eq__. – Rahul

+2

En realidad, el gancho '__nonzero__' implementa la prueba del valor de verdad. – miku

0
mybool = {True: 'On', False: 'Off'} 
mybool[True] == 'On' 
mybool[False] == 'Off' 
5

Mi truco favorito es utilizar el bool para indexar una matriz:

return "Color: {0}".format(['Off','On'][has_color]) 

La advertencia es que el valor tiene que ser False, True, 0 o 1. Si tiene algo más, primero debe convertirlo a booleano.

+0

¿No sería más eficiente una tupla '('Desactivado', 'Activado') [color_hasta] '? – Zaz

+0

@Josh: Honestamente, no tengo ni idea. La única diferencia garantizada es que una lista es mutable y una tupla no, y aquí eso no importa.IIRC, la lista se encuentra en la cresta –

0

Si usted no quiere meterse con print ...

class BoolHack(object): 
    def __init__(self): 
     from sys import stdout 
     self.realout = stdout 

    def write(self, text): 
     if text == 'False': 
      text = 'Off' 
     elif text == 'True': 
      text = 'On' 
     self.realout.write(text) 

import sys 

sys.stdout = BoolHack() 

print "Hello world" # ==> Hello world 
print 1    # ==> 1 
print True, 10  # ==> On 10 
print False   # ==> Off 
print "True hack" # ==> True hack 

ADVERTENCIA: No utilizar en el código de producción de verdad! Esto es solo para completar tu conjunto de respuestas.

print llama a str() en los objetos a imprimir, y solo entonces pone la cadena en stdout ... por lo que no puede verificar el tipo de objeto. Pero es bastante raro imprimir 'False' o 'True' como una sola cadena, por lo que en su caso muy específico podría funcionar.

+0

¿por qué le daría a la gente ideas tan terribles? –

+1

@ Winston Ewert: incluso el truco más cruel a veces es útil. – liori

0
class Color: 
    def __init__(self,C): 
    if C==True: 
     self.col='On' 
    else: 
     self.col='Off' 

    def __cmp__(self,other): 
     return self.col 
3

True y False son singletons. Solo hay un objeto True y uno False en python. Como resultado, intentar heredar de ellos causa problemas. (Simplemente no estaban destinados a ser utilizados de esa manera).

No puede sobrecargar las operaciones lógicas u operaciones que le impedirán crear un objeto realmente bool. Va a volver constantemente a bool de pitón.

So: Do ​​not.

Si no desea que sus valores se impriman como Verdadero y Falso, no llame a imprimir directamente sobre ellos. La impresión es para una salida rápida y sucia. Si quieres algo más, entonces tendrás que hacer más trabajo. En este caso, todo lo que necesita es la función ToOnOff.

0

una lástima que no se puede hacer True.__str__=lambda:"On"

Por desgracia, se queja de que es de sólo lectura. De todos modos, esa sería una manera MUY hackosa de hacerlo!

0

probar este curioso:

a = True 
b = False 
print a and 'On' or 'Off' 
print b and 'On' or 'Off' 
1

Ahora estoy usando esta solución con sede fuera Rahul's code:

class OnOff(object): 
    def __init__(self, value): 
     self._value = value 

    def __str__(self): 
     if self._value: return 'On' 
     else: return 'Off' 

    def __cmp__(self, other): 
     return self._value.__cmp__(other) 

me cambió la función __cmp__ para permitir el objeto de comparar a Bools y también cambiaron algunos otras cosas menores Crédito completo a Rahul.

+0

Este es el código que usé al final. A pesar de esto, pensé que [el código de Rahul] (http://stackoverflow.com/questions/3687109#3687134) merece el tic. – Zaz

+0

[En realidad, he cambiado de opinión, he encontrado una forma de hacerlo sin crear una clase.] (Http://stackoverflow.com/questions/3687109#3691891) – Zaz

0

Tomando el consejo del público, he cambiado de idea y he encontrado una forma mejor de resolver mi problema que creando una clase: Convertir los elementos del menú a las cadenas fuera de la clase. Permitiéndome usar the solution proposed by THC4k.

Unidiff:

  menu.items=((
      ('Play Game', True), 
      ' ', 
      'Speed: ', (speed, True), 
      ' ', 
      'Screen: ', (screen_width, True), 'x', (screen_height, True), 
      ' ', 
-   'Color: ', (color, True), 
+   'Color: ', (("Off", "On")[color], True), 
      ' ', 
      ('Exit', True) 
     )) 

(Hice lo mismo para las demás variables, sólo estoy tratando de ser sucinta con el diff)

Cuestiones relacionadas