'bool'类型对象的未知格式代码'r'

时间:2014-09-12 17:58:51

标签: python string-formatting

这有效:

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()打印&#34; True&#34;或&#34;错误&#34;对于布尔?

2 个答案:

答案 0 :(得分:4)

嗯,首先:

  

如何使.format()打印&#34; True&#34;或&#34;错误&#34;对于布尔?

不要指明任何事情。 bool值的默认格式已经为您提供了'True''False'% - 格式化:

也是如此
>>> '{0}'.format(False)
'False'
>>> '%s' % (False,)
'False'

__format__的{​​{1}},__str____repr__都返回相同的内容 - 在2.x中,bool返回Unicode版本的当然,同样的事情也是如此。这也意味着:

__unicode__

但更一般地说,如果您 需要>>> format(False), format(False, ''), repr(False), str(False), unicode(False) ('False', 'False', 'False', 'False', u'False') ,那么您将如何使用%r进行此操作?

嗯,没有这样的格式规范代码format后面的东西):,但是有转换修饰符flag rr分隔符之后,!之前的内容(如果存在)。所以:

:

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

  

转换字段会在格式化之前导致类型强制。通常,格式化值的工作是通过值本身的'{0!r}'.format(1==2) 方法完成的。但是,在某些情况下,最好强制将类型格式化为字符串,从而覆盖其自己的格式定义。通过在调用__format__()之前将值转换为字符串,可以绕过正常的格式化逻辑。

     

目前支持三种转换标记:__format__()调用值'!s'str()调用'!r'repr()调用'!a' }。

请注意,这也意味着基本ascii()实际上并不像'{0}'.format(1==2)那样做,因为它调用的是'%s' % (1=2,)而不是__format__

更一般地说,虽然许多格式规范代码符合__str__格式转换类型代码 - 格式化,但它并不完全匹配。除了分裂&#34;转换类型&#34;的想法分为两个单独的东西,也有代码巧妙或根本不同的东西 - 最明显的是,%意味着&#34;这不是格式代码,它是文字'%%' &#34;,而%表示&#34;打印此百分比&#34;。当它不明显时,文档总是清晰的。

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