未知格式代码'r'用于布尔类型对象
这个可以用:
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()
打印出 "True" 或 "False" 来表示布尔值呢?
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'
首先:
你怎么用 .format() 来打印布尔值 "True" 或 "False" 呢?
其实很简单,什么都不需要指定。布尔值的默认格式化已经会给你 'True'
或 'False'
了。用 %
格式化也是一样的:
>>> '{0}'.format(False)
'False'
>>> '%s' % (False,)
'False'
对于布尔值,__format__
、__str__
和 __repr__
方法返回的结果都是一样的。在 Python 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__()
方法来完成的。然而,在某些情况下,我们希望强制将某个类型格式化为字符串,覆盖它自己的格式化定义。通过在调用__format__()
之前将值转换为字符串,可以绕过正常的格式化逻辑。目前支持三种转换标志:
'!s'
会对值调用str()
,'!r'
会调用repr()
,而'!a'
会调用ascii()
。
需要注意的是,这也意味着基本的 '{0}'.format(1==2)
实际上和 '%s' % (1=2,)
并不完全一样,因为它调用的是 __format__
而不是 __str__
。
更一般来说,虽然很多格式说明符和 %
格式化的转换类型代码是匹配的,但并不是完全一致的。除了将“转换类型”的概念分成两个不同的部分外,还有一些代码会做出微妙或根本不同的事情——最明显的是,'%%'
表示“这不是一个格式代码,而是一个字面上的 %
”,而 ':%'
则表示“将其作为百分比打印”。当不太明显时,文档总是会很清楚地说明。