何时在Python中使用%r而不是%s?

cof*_*der 160 python string string-formatting

学习Python艰难之路第21页,我看到这个代码示例:

x = "There are %d types of people." % 10
...
print "I said: %r." % x
Run Code Online (Sandbox Code Playgroud)

为什么%r在这里使用而不是%s?你何时使用%r,何时使用%s

Ben*_*mes 304

%s说明符转换使用对象str(),并%r使用其转换repr().

对于某些对象(如整数),它们会产生相同的结果,但是repr()特别之处(对于可能的类型),它通常会返回一个有效的Python语法结果,可以用来明确地重新创建它所代表的对象.

这是一个使用日期的例子:

>>> import datetime
>>> d = datetime.date.today()
>>> str(d)
'2011-05-14'
>>> repr(d)
'datetime.date(2011, 5, 14)'
Run Code Online (Sandbox Code Playgroud)

对于该类型repr()不产生Python语法包括那些指向外部资源,如file,你不能保证在不同的上下文重新.

  • 我喜欢这个例子,因为它显示了%s和%r之间的巨大差异......大多数例子只显示了类似"苹果"和苹果的东西,然后我们不清楚为什么我们甚至有%r. (44认同)
  • 在字符串格式中使用这些字符时,一个重要的区别是%r还将包含定界引号。print('Text:%r'%'Hello')->文本:'Hello',print('Text:%s'%'Hello')->文本Hello (2认同)

man*_*lds 15

%r 显示引号:

它会像:

I said: 'There are 10 types of people.'.
Run Code Online (Sandbox Code Playgroud)

如果你曾经使用%s它将是:

I said: There are 10 types of people..
Run Code Online (Sandbox Code Playgroud)

  • 仅对字符串为true,其他类型具有不同的行为 (15认同)
  • @Winston Ewert - 当然,我回答了问题的例子,因为在这个例子中,它显然被用来产生引号. (4认同)

Pra*_*hat 15

使用%rfor调试,因为它显示变量的"原始"数据,但其他数据用于向用户显示.

这就是%r格式化的工作原理; 它以你编写它(或接近它)的方式打印它.这是调试的"原始"格式.这里\n用来向用户显示不起作用.%r显示变量的原始数据的表示.

months = "\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"
print "Here are the months: %r" % months
Run Code Online (Sandbox Code Playgroud)

输出:

Here are the months: '\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug'
Run Code Online (Sandbox Code Playgroud)

从Learn Python the Hard Way中查看此示例.


mac*_*loo 14

这是Ben James答案的一个版本,上面是:

>>> import datetime
>>> x = datetime.date.today()
>>> print x
2013-01-11
>>> 
>>> 
>>> print "Today's date is %s ..." % x
Today's date is 2013-01-11 ...
>>> 
>>> print "Today's date is %r ..." % x
Today's date is datetime.date(2013, 1, 11) ...
>>>
Run Code Online (Sandbox Code Playgroud)

当我跑这个时,它帮助我看到了%r的用处.

  • 这对他的回答有什么影响? (8认同)
  • @fugu实际上给出了使用`%r`和`%s`说明符打印输出的示例,因此用户可以更清楚地看到差异. (4认同)