Это сообщение об ошибке появляется всякий раз, когда вы используете строку формата со спецификациями позиционных форматов (например, {}
или {1}
), но передаете только аргументы ключевого слова.
Аналогично, вы получаете KeyError
, когда используете строку формата с только спецификациями формата ключевого слова (например, {v}
), но передаете только позиционные аргументы:
>>> '{}'.format(i=1)
IndexError: tuple index out of range
>>> '{i}'.format(1)
KeyError: 'i'
Исправление состоит в том, чтобы ваши спецификации соответствовали вашим аргументам. В любом случае, вам нравится, все в порядке, они просто должны быть последовательными:
>>> '{i}'.format(i=1)
1
>>> '{}'.format(1)
1
Несмотря на все сказанное, я не уверен, какой смысл в этом:
"shiprow{}".format(i = range(0, 10))
Вы можете исправить это в любом случае, но вам действительно нужна эта строка?
>>> "shiprow{i}".format(i = range(0, 10))
'shiprowrange(0, 10)'
>>> "shiprow{}".format(range(0, 10))
'shiprowrange(0, 10)'
Если вам интересно , почему вы получаете эту ошибку, немного упрощая format
, она работает так:
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
Итак, когда он видит спецификации формата {}
, он ищет args[0]
. Поскольку вы не передали никаких позиционных аргументов, args
- это пустой кортеж ()
, поэтому args[0]
- это IndexError
.
Возможно, будет лучше, если format
обработает эти ошибки и превратит их во что-то более приятное, но иногда полезно иметь возможность обрабатывать KeyError
программно. (Не так часто IndexError
, но, очевидно, оба должны работать одинаково.)