2015-10-13 113 views
15

正如标题所述,这两个标志有什么区别?看来他们都使用repr()将值转换为字符串? 此外,在这行代码中:Python中!r和%r有什么区别?

"{0!r:20}".format("Hello") 

!r前面的0做什么?

+2

的0表示“使用0号位置参数” - 你只需要它,如果你的意思是使用的位置参数之一不止一次或者你需要支持Python 2.6。 ''{} {}“'.format(...)'被自动编号,以便在Python 2.7和3.x中被视为”{0} {1}“。 – lvc

+0

可能重复的[Python字符串格式:%与.format](http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format) –

回答

21

%rstr.format()格式操作中不是有效的占位符;它只适用于old-style % string formatting。它确实通过repr()函数将对象转换为表示形式。

str.format(),!r是等价的,但这也意味着您现在可以使用所有format codes作为字符串。通常str.format()将在对象本身上调用object.__format__()方法,但通过使用!r,则使用repr(object).__format__()代替。

还有!s和(在Python 3中)!a转换器;这些首先应用str()ascii()函数。

前面的0表示将使用str.format()方法填充该插槽的参数;在你的情况下,位置参数0"Hello"。你可以使用命名为论证过了,在对象传递作为关键字参数:

"{greeting!r:20}".format(greeting="Hello") 

除非你正在使用Python 2.6,你可以省略这个因为没有索引或名称自动编号插槽;第一{}0,第二{}发生在指数1第二个参数,等等

+1

谢谢,你能澄清你的意思是“this也意味着你现在可以使用字符串的所有格式代码“? –

+1

':'冒号后面的代码被传递给'object .__格式的__()'方法,因此是类型特定的。浮点数字接受来自字符串的不同格式化代码。因此,如果对象是一个浮点数,那么当你添加'!r'时,你会使用不同的格式化代码。 –

相关问题