使Python bool打印'开'或'关'而不是'真'或'假'

时间:2010-09-10 18:07:51

标签: python printing boolean

制作与bool完全相同的变量但打印OnOff而不是TrueFalse的最佳方法是什么?目前该计划正在打印:Color: True,而Color: On会更有意义。

为了记录,我最初尝试创建一个继承自OnOff的{​​{1}}类:

bool

从评论中,我现在明白class OnOff(bool): def __str__(self): if self: return 'On' else: return 'Off' 是一个单身人士,这就是为什么这次失败的原因:

bool

12 个答案:

答案 0 :(得分:18)

print ("Off", "On")[value]也适用(因为(False, True) == (0,1)

答案 1 :(得分: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)

虽然这可能对你来说太过分了。 :)

答案 2 :(得分:5)

我最喜欢的技巧是使用bool来索引数组:

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

需要注意的是,该值必须为FalseTrue01。如果您还有其他内容,则必须先将其转换为布尔值。

答案 3 :(得分:4)

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

答案 4 :(得分:3)

真与假是单身人士。 python中只有一个True对象和一个False对象。因此,尝试从它们继承会导致问题。 (他们只是不打算以这种方式使用)。

您不能重载逻辑和/或操作,这会阻止您创建类似bool的对象。它会不断恢复到python的布尔。

所以:不要。

如果您不希望您的值打印为True和False,请不要直接在它们上打印。打印用于快速和脏输出。如果你想要更多的东西,那么它就会让你需要做更多的工作。在这种情况下,您只需要ToOnOff功能。

答案 5 :(得分:1)

我现在使用此解决方案基于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)

我更改了__cmp__函数以使对象能够与bools进行比较,并且还更改了其他一些小东西。完全归功于Rahul

答案 6 :(得分:0)

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

答案 7 :(得分:0)

如果你不想搞砸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'作为单个字符串打印是非常罕见的,因此在您非常特殊的情况下它可能会起作用。

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

可惜你做不到True.__str__=lambda:"On"

不幸的是它抱怨它是只读的。无论如何,这将是一个非常黑客的方式来做它!

答案 10 :(得分:0)

试试这个好奇的人:

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

答案 11 :(得分:0)

根据公众的建议,我改变了主意,找到了解决问题的更好方法,而不是创建一个类:将菜单项转换为字符串类之外。允许我使用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)
         ))

(我对其他变量做了同样的事情,我只是想用差异来简洁)