% r 的意思是什么?

以下陈述中 %r的含义是什么?

print '%r' % (1)

我想我听说过 %s%d%f,但从来没有听说过这个。

53267 次浏览

它对对象调用 repr()并插入结果字符串。

它使用 repr()以字符串的形式输出替换。

请参阅文档中的 字符串格式化操作。请注意,% s 和% d 等语言的工作方式可能与您所期望的不同,如果您习惯了它们在另一种语言(如 C)中的工作方式的话。

特别是,% s 对整型和浮点数也很有效,除非您有特殊的格式要求,其中% d 或% f 将给予您更多的控制。

背景:

在 Python 中,有两个用于将对象转换为字符串的内置函数: strreprstr应该是一个友好的、人类可读的字符串。repr应该包含关于对象内容的详细信息(有时,它们会返回相同的内容,比如整数)。按照惯例,如果有一个 Python 表达式将对另一个对象进行 eval,那么 repr将返回这样一个表达式,例如。

>>> print repr('hi')
'hi'  # notice the quotes here as opposed to...
>>> print str('hi')
hi

如果返回的表达式对对象没有意义,那么 repr应该返回一个由 < 和 > 符号包围的字符串,例如 <blah>

回答你最初的问题:

%s <-> str
%r <-> < a href = “ https://docs.python.org/2/library/function tions.html # func-repr”rel = “ noReferrer”> 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'在拥有具有异构数据类型的列表的场景中也很有用。 假设我们有一个 list = [1, 'apple' , 2 , 'r','banana'] 显然,在这种情况下,使用 '%d''%s'会导致错误。相反,我们可以使用 '%r'来打印所有这些值。

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

%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'"

%s调用所选对象的 __str()__方法并用返回值替换自身,

%r调用所选对象的 __repr()__方法并用返回值替换自身。

我在《艰难学习 Python 》一书中读到,作者说

% r 是最好的调试格式,其他格式用于向用户显示变量