%r 是啥意思?
Posted
技术标签:
【中文标题】%r 是啥意思?【英文标题】:What is the meaning of %r?%r 是什么意思? 【发布时间】:2011-01-22 04:44:46 【问题描述】:下面语句中%r
是什么意思?
print '%r' % (1)
我想我听说过%s
、%d
和%f
,但从未听说过。
【问题讨论】:
【参考方案1】:背景:
在 Python 中,有两个内置函数可以将对象转换为字符串:str
与 repr
。 str
应该是一个友好的、人类可读的字符串。 repr
应该包含有关对象内容的详细信息(有时,它们会返回相同的内容,例如整数)。按照惯例,如果有一个 Python 表达式将评估另一个对象 ==,repr
将返回这样的表达式,例如
如果返回一个表达式对一个对象没有意义,repr
应该返回一个由 符号包围的字符串,例如<blah>
.
回答你原来的问题:
%s
str
%r
repr
另外:
您可以通过实现__str__
和__repr__
方法来控制您自己的类的实例转换为字符串的方式。
class Foo:
def __init__(self, foo):
self.foo = foo
def __eq__(self, other):
"""Implements ==."""
return self.foo == other.foo
def __repr__(self):
# if you eval the return value of this function,
# you'll get another Foo instance that's == to self
return "Foo(%r)" % self.foo
【讨论】:
我发现 %r 对于打印未知编码的字符串很有用,否则 %s 会引发错误【参考方案2】:它在对象上调用repr()
并插入结果字符串。
【讨论】:
【参考方案3】:它将替换打印为带有repr()
的字符串。
【讨论】:
【参考方案4】:除了上面给出的回复之外,'%r'
在您有一个具有异构数据类型的列表的情况下可能很有用。
比方说,我们有一个list = [1, 'apple' , 2 , 'r','banana']
显然在这种情况下使用'%d'
或'%s'
会导致错误。相反,我们可以使用'%r'
来打印所有这些值。
【讨论】:
【参考方案5】:%r
和%s
的区别在于,%r
调用repr()
方法,%s
调用str()
方法。这两个都是内置的 Python 函数。
repr()
方法返回给定对象的可打印表示。
str()
方法返回给定对象的“非正式”或可很好打印的表示。
简单来说,str()
方法的作用是以最终用户希望看到的方式打印结果:
name = "Adam"
str(name)
Out[1]: 'Adam'
repr()
方法将打印或显示对象的实际外观:
name = "Adam"
repr(name)
Out[1]: "'Adam'"
【讨论】:
【参考方案6】:%s <=> str
%r <=> repr
%r
在对象上调用repr()
,并插入__repr__
返回的结果字符串。
__repr__
返回的字符串应该是明确的,并且如果可能,匹配重新创建所表示的对象所需的源代码。
一个简单的例子:
class Foo:
def __init__(self, foo):
self.foo = foo
def __repr__(self):
return 'Foo(%r)' % self.foo
def __str__(self):
return self.foo
test = Foo('Text')
所以,
in[1]: test
Out[1]: Foo('Text')
in[2]: str(test)
Out[2]: 'Text'
【讨论】:
【参考方案7】:%s
调用选中对象的__str()__
方法,并用返回值替换自己,
%r
调用所选对象的__repr()__
方法,并将其自身替换为返回值。
【讨论】:
【参考方案8】:请参阅文档中的 String Formatting Operations。请注意,如果您习惯使用其他语言(例如 C)的工作方式,则 %s 和 %d 等的工作方式可能与您的预期不同。
特别是,%s 也适用于整数和浮点数,除非您有特殊的格式要求,其中 %d 或 %f 会给您更多控制权。
【讨论】:
【参考方案9】:我在《Learning Python the Hard Way》中读到,作者说
%r 最适合调试,其他格式用于向用户显示变量
【讨论】:
以上是关于%r 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章