Сделайте так, чтобы 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 ]

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

print ("Off", "On")[value] тоже работает (потому что (False, True) == (0,1))

10 голосов
/ 10 сентября 2010
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)

Хотя это может быть излишним для вас. :)

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

Мой любимый трюк - использовать bool для индексации массива:

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

Предупреждение: значение должно быть False, True, 0 или 1,Если у вас есть что-то еще, вы должны сначала преобразовать его в логическое значение.

4 голосов
/ 10 сентября 2010
print "On" if color else "Off"    # Python 2.x
print ("On" if color else "Off")  # Python 3.x
3 голосов
/ 10 сентября 2010

Истина и Ложь - синглтоны. В питоне есть только один объект True и один объект False. В результате попытка наследования от них вызывает проблемы. (Они просто не должны были использоваться таким образом).

Вы не можете перегружать логические и / или операции, которые не позволят вам создать действительно похожий на bool объект. Это будет постоянно возвращаться к bool питона.

Итак: не надо.

Если вы не хотите, чтобы ваши значения печатались как True и False, не вызывайте print для них напрямую. Печать для быстрого и грязного вывода. Если вы хотите чего-то большего, то это даст вам больше работы. В этом случае все, что вам нужно, это функция ToOnOff.

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

Я сейчас использую это решение на основе кода Рахула :

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)

Я изменил функцию __cmp__, чтобы объект мог сравниваться с bools, а также изменил некоторые другие мелочи. Полный кредит на Рахул .

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

Прислушиваясь к советам общественности, я передумал и нашел лучший способ решения своей проблемы, чем создание класса: преобразовать элементы меню в строки вне класса. Позвольте мне использовать решение, предложенное THC4k .

Унифицированный

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

(я сделал то же самое для других переменных, я просто пытаюсь быть кратким с diff)

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

Попробуйте этот любопытный:

a = True
b = False
print a and 'On' or 'Off'
print b and 'On' or 'Off'
0 голосов
/ 10 сентября 2010

Жаль, что вы не можете сделать True.__str__=lambda:"On"

К сожалению, он жалуется, что только для чтения.В любом случае, это ОЧЕНЬ хакерский способ сделать это!

0 голосов
/ 10 сентября 2010
class Color:
    def __init__(self,C):
    if C==True:
        self.col='On'
    else:
        self.col='Off'

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