2014-09-12 57 views
0

这工作:未知格式代码 'R' 为 'BOOL' 类型的对象

In [3]: print "%r"%(1==2) 
False 

这类作品:

In [2]: formatted_str = "{0:1.2f}".format(1==2) 

In [3]: formatted_str 
Out[3]: '0.00' 

但是:

In [5]: formatted_str = "{0:r}".format(1==2) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-5-b136410cc311> in <module>() 
----> 1 formatted_str = "{0:r}".format(1==2) 

ValueError: Unknown format code 'r' for object of type 'bool' 

你如何让.format()为bool打印“True”或“False”?

回答

4

嗯,首先:

如何让.format()为bool打印“True”或“False”?

只是不指定任何东西。 bool值的默认格式已经为您提供'True''False'。而同样如此% -formatting:

>>> '{0}'.format(False) 
'False' 
>>> '%s' % (False,) 
'False' 

__format____str__,并__repr__bool都返回同样的事情 - 在2.X的__unicode__返回同样的事情,一个Unicode版本也是如此,课程。这也意味着:

>>> format(False), format(False, ''), repr(False), str(False), unicode(False) 
('False', 'False', 'False', 'False', u'False') 

但更普遍的,如果你没有需要%r,你会怎么做,与format

那么,有没有这样的格式规范代码r(在:后到来的东西),但有一个转换修改标志r(事情的!分离后,和之前的:,如果存在)。所以:

'{0!r}'.format(1==2) 

Format String Syntax该文档更详细地解释:

转换字段格式化之前引起类型强制。通常,格式化值的工作是通过值本身的__format__()方法完成的。但是,在某些情况下,希望强制将某个类型格式化为字符串,并覆盖自己的格式定义。通过在调用__format__()之前将该值转换为字符串,正常的格式化逻辑被绕过。目前

三个转换标志的支持:'!s'它呼吁值str()'!r'这就要求repr()'!a'这就要求ascii()

注意,这也意味着,基本'{0}'.format(1==2)实际上并没有做同样的事情'%s' % (1=2,),因为它调用__format__而非__str__

更普遍,而多为% -formatting格式规范代码匹配格式转换类型代码,它不是完全匹配。除了拆分“转换型”的概念分为两​​个独立的东西,也有那些微妙或根本代码不同的事情,最明显的是,'%%'的意思是“这不是一个格式代码,这是一个文字%”,而':%'手段“以百分比打印这个“。当它不明显时,文档总是很清楚。

+1

这是一个很好的答案。我喜欢你如何突出显示转换修饰符标志并解释说'!'是一个_separator_。我觉得你在阅读这个答案之前已经比我能够更好地理解我对格式迷你语言的理解。从我+1。 – mgilson 2014-09-12 18:11:59

+0

@mgilson:我对所有这些作品都有正确的条款吗?我没有问题,记住如何使用它们,但记住什么叫他们是另一回事... – abarnert 2014-09-12 18:14:11

+0

不知道:) - 他们甚至可能没有名字(前现在)。我用的是“转换修正标志”如此罕见,我需要我想要它...... – mgilson 2014-09-12 18:16:54

2

像这样(python2.7 +):

>>> '{!r}'.format(1 == 2) 
'False' 

或者,如果你想指定的位置(或者被迫与python2.6的兼容):

>>> '{1!r} is not {0!r}'.format(1==2, 1==1) 
'True is not False' 

你甚至可以使用关键字正常:

>>> '{foo!r} is not {0!r}'.format(1==2, foo=1==1) 
'True is not False'