未知格式代码'r'用于布尔类型对象

0 投票
2 回答
1715 浏览
提问于 2025-04-21 08:49

这个可以用:

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 个回答

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'
4

首先:

你怎么用 .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__

更一般来说,虽然很多格式说明符和 % 格式化的转换类型代码是匹配的,但并不是完全一致的。除了将“转换类型”的概念分成两个不同的部分外,还有一些代码会做出微妙或根本不同的事情——最明显的是,'%%' 表示“这不是一个格式代码,而是一个字面上的 %”,而 ':%' 则表示“将其作为百分比打印”。当不太明显时,文档总是会很清楚地说明。

撰写回答