<p>每当您使用带有位置格式规范的格式字符串(如<code>{}</code>或<code>{1}</code>),但只传递关键字参数时,就会收到此错误消息。在</p>
<p>类似地,如果只使用关键字格式规范的格式字符串(如<code>{v}</code>),但只传递位置参数,则会得到一个<code>KeyError</code>:</p>
<pre><code>>>> '{}'.format(i=1)
IndexError: tuple index out of range
>>> '{i}'.format(1)
KeyError: 'i'
</code></pre>
<p>解决方法就是让你的规格与你的参数相匹配。不管你喜欢哪种方式都可以,它们只需保持一致:</p>
^{pr2}$
<hr/>
<p>尽管如此,我不知道这有什么意义:</p>
<pre><code>"shiprow{}".format(i = range(0, 10))
</code></pre>
<p>你可以用任何一种方法来修复它,但这真的是你想要的字符串吗?在</p>
<pre><code>>>> "shiprow{i}".format(i = range(0, 10))
'shiprowrange(0, 10)'
>>> "shiprow{}".format(range(0, 10))
'shiprowrange(0, 10)'
</code></pre>
<hr/>
<p>如果您很好奇为什么会出现这个错误,将<code>format</code>简单化了一点,它是这样工作的:</p>
<pre><code>def format(self, *args, **kwargs):
result = ''
index = 0
bits = self.parse_format_stuff()
for bit in bits:
if bit is a regular string:
result += bit
elif bit is empty braces:
result = args[index]
index += 1
elif bit is a number in braces:
result += args[number]
elif bit is a valid identifier string in braces:
result += kwargs[identifier]
else:
raise a ValueError
return result
</code></pre>
<p>所以,当它看到<code>{}</code>格式规范时,它会查找<code>args[0]</code>。因为没有传递任何位置参数,<code>args</code>是空元组<code>()</code>,所以{<cd7>}是<code>IndexError</code>。在</p>
<p>可以说,如果<code>format</code>处理这些错误并将它们转化为更好的东西可能会更好,但有时能够以编程方式处理<code>KeyError</code>会很有用。(不经常使用<code>IndexError</code>,但显然两者必须以相同的方式工作。)</p>