旧式字符串格式需要显式 str() 转换吗?

Explicit str() conversion needed for old-style string formatting?

我正在维护一个旧的 Python 代码库,其中散布着一些非常奇怪的习语。我遇到的一件事是使用百分比编码样式的字符串格式:

'Error %s: %s' % (str(err), str(message))

忽略现代字符串插值.format()的存在,我的问题是:

是否有必要使用 str() 显式转换 %s 参数,或者这正是 %s 所做的?

不,不需要显式 str() 调用,%s 格式化程序 包含 一个 str() 调用:

>>> class Foo(object):
...     def __str__(self):
...         return "I am a string for Foo"
... 
>>> '%s' % Foo()
'I am a string for Foo'

这也明确记录在 String Formatting Operations section:

's'
String (converts any Python object using str()).

不需要那样做。 %s 是用于打印的字符串格式化语法。这可能有助于添加更多上下文:

What does %s mean in Python?

这取决于您使用的具体规格。使用接近 C 语言 printf 语法的旧样式格式化。例如,

  • %s 显示一个字符串(对传递的参数调用 str())。
  • %r 显示表示(对传递的参数调用 repr())。
  • %d取一个数。
  • 等等

您在 documentation 上有整个列表。