【问题标题】:Make Python bool print 'On' or 'Off' rather than 'True' or 'False'使 Python bool 打印 'On' 或 'Off' 而不是 'True' 或 'False'
【发布时间】:2010-09-10 18:07:51
【问题描述】:

创建一个与 bool 完全一样工作但打印 OnOff 而不是 TrueFalse 的变量的最佳方法是什么?目前程序正在打印:Color: True,而Color: On 会更有意义。

为了记录,我最初尝试创建一个继承自 boolOnOff 类:

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

从 cmets 中,我现在了解到 bool 是一个单例,这就是为什么它惨败的原因:

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

【问题讨论】:

  • 我认为代码与问题无关:我只想创建一个行为与 bool 完全相同的变量,但打印 OnOff 代替 TrueFalse.
  • @Josh:这不是“为 me.com 做我的功课”。请发布您尝试过的代码,以便我们了解您的理解程度。
  • @S.Lott:这不是家庭作业,正如我所说,我没有任何与问题本身相关的代码。如果您必须查看一些代码,请查看here
  • @Josh:(1) 尝试问题本身,以及 (2) 发布您尝试过的代码,这很有帮助。真的很多。我们对“请为我写这段代码”的问题持一种模糊的看法。
  • @S.Lott:如果我有任何代码,我会发布代码,只是我是 OOP 的新手,在这种情况下,我什至不知道如何开始。我确实尝试创建一个继承自 bool 的类,但它失败了——你是说我应该发布该代码吗?

标签: python printing boolean


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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)
    

    虽然这对你来说可能有点矫枉过正。 :)

    【讨论】:

    • 这是迄今为止最好的解决方案,但该类根本不像普通的布尔值。
    • 如果你想让它像普通的 bool 一样工作,请覆盖 __eq__ 方法。
    • 其实__nonzero__钩子实现的是真值测试。
    • 这似乎不是正确的做法。颜色与 bool 类型无关。对我来说,组合优于继承,因为它提供了更大的控制权。
    • 如果Color 不需要是与bool 不同的类型,那么这个答案是多余的。 @Josh,如果我没看错,您关心的是presentation,而不是内部representationoperation。在内部,您希望它成为一个布尔值,对吧?如果您只关心演示,那么您可以使用str() 以外的函数将bool 转换为str。比如说,['Off','On'][my_bool_value]
    【解决方案3】:

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

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

    需要注意的是,该值必须为 FalseTrue01。如果你有别的东西,那么你必须先将它转换为布尔值。

    【讨论】:

    • 元组('Off','On')[has_color]不是更高效吗?
    • @Josh:老实说,我不知道。唯一可以保证的区别是列表是可变的,而元组不是,这无关紧要。 IIRC,这个名单是有顶的
    【解决方案4】:
    print "On" if color else "Off"    # Python 2.x
    print ("On" if color else "Off")  # Python 3.x
    

    【讨论】:

    • 打印语句在一个循环外部变量的类中,所以这不是很实用。
    【解决方案5】:

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

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

    所以:不要。

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

    【讨论】:

      【解决方案6】:

      我现在使用这个基于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__ 函数以使对象能够与布尔值进行比较,还更改了一些其他小东西。完全归功于Rahul

      【讨论】:

      【解决方案7】:
      mybool = {True: 'On', False: 'Off'}
      mybool[True] == 'On'
      mybool[False] == 'Off'
      

      【讨论】:

        【解决方案8】:

        如果你不想惹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(),然后才将字符串放入标准输出...所以您无法检查对象的类型。但是将 'False' 或 'True' 打印为单个字符串是非常罕见的,因此在您非常具体的情况下它可能会起作用。

        【讨论】:

        • 你为什么会给人们这么糟糕的想法!
        • @Winston Ewert:即使是最粗暴的 hack 有时也很有用。
        【解决方案9】:
        class Color:
            def __init__(self,C):
            if C==True:
                self.col='On'
            else:
                self.col='Off'
        
            def __cmp__(self,other):
                return self.col 
        

        【讨论】:

          【解决方案10】:

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

          不幸的是,它抱怨它是只读的。无论如何,这将是一种非常骇人听闻的方式!

          【讨论】:

            【解决方案11】:

            试试这个奇怪的:

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

            【讨论】:

              【解决方案12】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-10-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-07-16
                • 1970-01-01
                • 2011-04-09
                相关资源
                最近更新 更多