Сделайте так, чтобы Python bool печатал «On» или «Off», а не «True» или «False». - PullRequest
5 голосов
/ 10 сентября 2010

Как лучше всего создать переменную, которая работает точно так же, как bool, но печатает On или Off, а не True или False? В настоящее время программа печатает: Color: True, тогда как Color: On будет иметь больше смысла.

Для справки, я изначально пытался создать класс OnOff, который наследуется от bool:

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

Из комментариев я теперь понимаю, что bool является синглтоном, поэтому это с треском провалилось:

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

Ответы [ 12 ]

0 голосов
/ 10 сентября 2010

Если вы не хотите связываться с 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

ВНИМАНИЕ: Не используйте в реальном производственном коде! Это только для того, чтобы завершить ваш набор ответов.

print вызывает str () для объектов для печати, и только затем помещает строку в stdout ... так что вы не можете проверить тип объекта. Но довольно редко просто печатать «False» или «True» как одну строку, поэтому в вашем очень специфическом случае это может сработать.

0 голосов
/ 10 сентября 2010
mybool = {True: 'On', False: 'Off'}
mybool[True] == 'On'
mybool[False] == 'Off'
...