制作与bool完全相同的变量但打印On
或Off
而不是True
或False
的最佳方法是什么?目前该计划正在打印:Color: True
,而Color: On
会更有意义。
为了记录,我最初尝试创建一个继承自OnOff
的{{1}}类:
bool
从评论中,我现在明白class OnOff(bool):
def __str__(self):
if self: return 'On'
else: return 'Off'
是一个单身人士,这就是为什么这次失败的原因:
bool
答案 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])
需要注意的是,该值必须为False
,True
,0
或1
。如果您还有其他内容,则必须先将其转换为布尔值。
答案 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。
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)
))
(我对其他变量做了同样的事情,我只是想用差异来简洁)