2010-09-10 8 views
5

Was ist der beste Weg, um eine Variable zu machen, die genau wie ein Bool funktioniert, aber druckt On oder Off statt True oder False? Derzeit druckt das Programm: Color: True, während Color: On mehr Sinn machen würde.Python Make Bool print ‚On‘ oder ‚Off‘ und nicht ‚True‘ oder ‚False‘

Für das Protokoll, ich versuchte zunächst eine OnOff Klasse zu machen, die von bool erbt:

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

Aus den Kommentaren, ich verstehe jetzt, dass bool ein Singleton ist, weshalb diese kläglich gescheitert:

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

Können Sie Code schreiben? –

+0

Ich glaube nicht, dass der Code für das Problem relevant ist: Ich möchte nur eine Variable erstellen, die genau wie ein Bool wirkt, aber "On" und "Off" anstelle von "True" oder "False" ausgibt. – Zaz

+3

@Josh: Das ist nicht "mach meine Hausaufgaben für mich.com". Bitte posten Sie den Code, den Sie ausprobiert haben, damit wir sehen können, was Sie verstehen. –

Antwort

17

print ("Off", "On")[value] Werke (weil (False, True) == (0,1))

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

Die print-Anweisung befindet sich innerhalb einer Klasse, die externe Variablen überbrückt. Dies ist also nicht sehr praktisch. – Zaz

+0

Sollte das untere Beispiel nicht sowohl in 2.x als auch in 3.x funktionieren? –

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) 

Obwohl dies sein könnte Overkill für dich. :)

+0

Dies ist die beste Lösung bisher, aber diese Klasse funktioniert überhaupt nicht wie ein normaler Bool. – Zaz

+0

Wenn Sie möchten, dass es wie ein normales bool funktioniert, überschreiben Sie die __eq__ Methode. – Rahul

+2

Tatsächlich implementiert der '__nonzero__'-Hook Wahrheitstest. – miku

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

Mein Lieblingstrick ist die Bool Index ein Array zu verwenden:

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

Der Nachteil ist, dass der Wert False, True, 0 oder 1 sein muss. Wenn Sie etwas anderes haben, müssen Sie es zuerst in einen booleschen Wert konvertieren. Auch

+0

Wäre kein Tupel '('Aus', 'Ein') [has_color]' effizienter? – Zaz

+0

@Josh: Ehrlich gesagt, habe ich keine Ahnung. Der einzige garantierte Unterschied ist, dass eine Liste änderbar ist und ein Tupel nicht, und das spielt keine Rolle.IIRC, die Liste ist crested –

0

Wenn Sie wollen nicht zu verwirren mit 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 

WARNUNG: Verwenden Sie nicht in realen Produktionscode! Dies dient nur dazu, Ihre Antworten vollständig zu machen.

print ruft str() auf zu druckende Objekte auf und setzt dann die Zeichenkette auf stdout ... so können Sie den Typ des Objekts nicht überprüfen. Aber es ist ziemlich selten, nur "False" oder "True" als eine einzelne Zeichenfolge zu drucken, also könnte es in Ihrem sehr speziellen Fall funktionieren.

+0

Warum würden Sie Menschen so schreckliche Ideen geben! –

+1

@Winston Ewert: sogar der gröbste Hack ist manchmal nützlich. – 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

Wahr und Falsch sind Singletons. In Python gibt es nur ein Wahres und ein Falsches Objekt. Als Ergebnis verursacht der Versuch, von ihnen zu erben, Probleme. (Sie sollten einfach nicht auf diese Weise verwendet werden).

Sie können die logischen und/oder Operationen nicht überladen, die verhindern, dass Sie ein wirklich bool-ähnliches Objekt erstellen. Es wird ständig zu Pythons Bool zurückkehren.

Also: Nicht.

Wenn Sie nicht möchten, dass Ihre Werte als True und False ausgegeben werden, rufen Sie sie nicht direkt auf. Print ist für schnelle und schmutzige Ausgabe. Wenn du etwas mehr willst, dann gibt es mehr Arbeit. In diesem Fall brauchen Sie nur die ToOnOff-Funktion.

0

Schaden Sie nicht True.__str__=lambda:"On"

tun können leider klagt sie es schreibgeschützt ist. Wie auch immer, das wäre ein sehr hackscher Weg!

0

Versuchen Sie diese merkwürdige:

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

ich jetzt diese Lösung bin mit Rahul's code beruhte:

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) 

Ich habe die __cmp__ Funktion, das Objekt zu ermöglichen, bools zu vergleichen und änderte auch einige andere kleine Dinge. Volle Gutschrift an Rahul.

+0

Dies ist der Code, den ich am Ende verwendet habe. Trotzdem dachte ich, [Rahuls Code] (http://stackoverflow.com/questions/3687109#3687134) verdient die Zecke. – Zaz

+0

[Eigentlich habe ich meine Meinung geändert, ich habe einen Weg gefunden, dies zu tun, ohne eine Klasse zu erstellen.] (Http://stackoverflow.com/questions/3687109#3691891) – Zaz

0

Mit dem Rat der Öffentlichkeit, habe ich meine Meinung geändert und einen besseren Weg gefunden, mein Problem zu lösen, als durch Erstellen einer Klasse: Konvertieren Sie die Menüelemente in Strings außerhalb der Klasse. Erlaubt mir, the solution proposed by THC4k zu verwenden.

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) 
     )) 

(Ich tat das gleiche für die anderen Variablen, ich versuche nur, mit dem diff prägnant zu sein)

Verwandte Themen