字符串格式混乱

String Formatting Confusion

O'Reilly 的 Learn Python Mark Lutz 的强大的面向对象编程教授格式化字符串的不同方法。

下面这段代码让我很困惑。我将 'ham' 解释为在索引零处填充格式位置标记,但它仍然在输出字符串的索引之一处弹出。请帮助我了解实际情况。

代码如下:

template = '{motto}, {0} and {food}'
template.format('ham', motto='spam', food='eggs')

这是输出:

'spam, ham and eggs'

我预计:

'ham, spam and eggs'

您唯一需要了解的是 {0} 指的是发送给 format() 的第一个(zeroeth)未命名 参数。我们可以通过删除所有未命名的引用并尝试使用线性填充来看到这种情况:

>>> "{motto}".format("boom")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'motto'

如果这是它的工作方式,您会期望 'boom' 会填写 'motto'。但是,format() 寻找参数 named 'motto'。这里的关键提示是 KeyError。类似地,如果它只是采用传递给 format() 的参数序列,那么这也不会出错:

>>> "{0} {1}".format('ham', motto='eggs')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

在这里,format() 正在参数列表中寻找第二个未命名的参数 - 但它不存在,所以它得到一个 'tuple index out of range' 错误。这只是 Python 中传递的未命名(位置敏感)和命名参数之间的区别。

See this post to understand the difference between these types arguments, known as 'args' and 'kwargs'.