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

2025年1月5日 | 阅读 4 分钟

Python 是一种通用且强大的计算机语言,提供了多种字符串格式化技术。一种常见的方法是使用格式说明符,特别是 %s 和 %r。虽然两者都用于将值嵌入字符串中,但它们具有不同的功能,并且可以产生不同的结果。理解何时使用 %r 而不是 %s 对于编写清晰、有效且无错误的aabbcc是至关重要的。本文深入探讨了 %r 和 %s 的细节,详细介绍了它们的区别、用例以及决定何时使用哪种的细微差别。

Python 中的字符串格式化

在深入研究 %r 和 %s 之前,掌握 Python 的字符串格式化算法至关重要。Python 有多种字符串格式化技术

  • 旧式字符串格式化 使用 % 运算符。
  • str.format() 方法提供新式字符串格式化。
  • f-strings(格式化字符串文字)是在 Python 3.6 中引入的。

'%s' 格式说明符

%s 格式说明符将给定值的字符串表示形式添加到另一个字符串中。它使用 str() 函数将输入值转换为字符串,这通常用于提供用户友好且可读的输出。

%s 示例

输出

Name: Alice, Age: 30

在此示例中,%s 将变量 name 和 age 转换为字符串。它会生成可读且清晰的输出,可以显示给最终用户。

'%r' 格式说明符

相反,%r 格式说明符使用 repr() 函数将提供的值转换为字符串。repr() 返回一个字符串,当提供给 eval() 函数时,该字符串将产生一个具有相同值的对象。它通常提供额外的信息,例如字符串周围的引号和转义字符,这使其更适合调试。

%r 示例

输出

Name: 'Alice', Age: 30

在这里,%r 显示带引号的字符串,表明 name 确实是一个字符串。这对于调试非常有用,因为它能更明确地表示值。

'%s' 和 '%r' 之间的区别

1. 使用的函数

  • %s 调用 str():将对象转换为用户友好的字符串。
  • %r 调用 repr():将对象转换为对开发人员更友好的字符串,该字符串能更详细地解释其性质。

2. 输出详细程度

  • %s 生成整洁、可读的输出。
  • %r 包含额外的信息,例如字符串引号和转义字符表示。

3. 用例

  • '%s' 通常用作最终用户输出。
  • '%r' 标志用于调试和日志记录。

比较输出

代码

输出

Using %s: Hello
World
Using %r: 'Hello\nWorld'

在这里,%s 按原样写入字符串。但是,%r 显式显示换行符,这对于调试可能很有用。

日志记录示例

在记录信息时,使用 %r 可能会提供对数据的更深入的了解。

代码

输出

DEBUG:root:User data: Name='Alice', Age=30

这种详细的输出有助于理解涉及的变量的具体类型和值。

处理复杂数据类型

对于更复杂的数据类型,例如列表或字典,区别就更加明显了

代码

输出

List with %s: ['Alice', 'Bob', 'Charlie']
List with %r: ['Alice', 'Bob', 'Charlie']
Dict with %s: {'name': 'Alice', 'age': 30}
Dict with %r: {'name': 'Alice', 'age': 30}

虽然这些实例中的输出看起来相同,但 %r 提供的完整表示在不同数据类型之间是一致的,从而保证显示任何隐藏的字符或特殊格式。

何时使用 %r 而不是 %s

  • 调试:当您需要了解正在处理的数据的确切性质时,包括任何特殊字符、引号或转义序列。
  • 日志记录:需要对开发人员可能访问的日志进行数据类型的全面表示。
  • 复杂数据类型:在处理复杂数据类型时,repr() 输出可以提供有关数据结构和内容更多的信息。

在 Python 中,'%r' 和 '%s' 之间的区别取决于输出要求的上下文。'%s' 应用于提供清晰、可读且用户友好的输出,非常适合向最终用户显示数据。它使用 'str()' 函数将对象转换为字符串,该函数专为清晰度和可读性而设计。另一方面,'%r' 更适合调试和日志记录。它使用 'repr()' 函数为对象提供详细的、对开发人员友好的字符串表示,包括任何特殊字符、引号或转义序列。这种详细的表示对于理解数据的确切性质至关重要,这有助于诊断问题和验证程序的内部状态。

为调试使用 %r,为面向用户的输出使用 %s,可确保您的代码向目标受众传达适当的详细程度。%r 显示数据的内部机制和细节,而 %s 以简单易懂的方式显示数据。这种格式说明符的有意使用提高了代码在各种上下文中的可读性、可维护性和整体有效性。