Я узнал от Антишаблоны Python, что вы можете сделать это:
person = {
'first': 'Tobin',
'age':20
}
print('{first} is {age} years old'.format(**person))
# Output: Tobin is 20 years old
person = {
'first':'Tobin',
'last': 'Brown',
'age':20
}
print('{first} {last} is {age} years old'.format(**person))
# Output: Tobin Brown is 20 years old
Однако, когда мой словарь содержит числовые ключи, он не работает:
>>> d = {'123': 123}
>>> d
{'123': 123}
>>> print('{123} is 123 value'.format(**d))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
Это относится как к Python 2, так и к 3. Это известное ограничение?
Учтите, что, вообще говоря, есть три способа указать, что какое-то внешнее выражение должно быть вставлено в строку, чей метод format
вызывается:
'{}, {}, {}'.format('huey', 'dewey', 'louie')
дает 'huey, dewey, louie'
.
'{2}, {1}, {0}'.format('huey', 'dewey', 'louie')
дает 'louie, dewey, huey'
.
'{first}, {second}, {third}'.format(first='huey', second='dewey', third='louie')
дает 'huey, dewey, louie'
.
Напомним, что в Python аргументы ключевых слов и имена переменных не могут начинаться с цифры.
Это ограничение относится к нашей текущей ситуации: если бы такие аргументы ключевых слов были возможны, мы не смогли бы разрешить двусмысленность между случаями 2 и 3; должен ли {0}
относиться к первому элементу безымянных дополнительных аргументов или аргументу ключевого слова 0
?
Поскольку нестроковые аргументы ключевого слова возможны нет, двусмысленности нет, и целое число в фигурных скобках всегда означает второй случай. Следовательно, в вашем коде {123}
на самом деле относится к 124-му элементу аргумента-tuple
, переданному format
, и, конечно, такого элемента нет.
Для полноты картины давайте посмотрим на f-строки, представленные в Python 3.6:
insert_me = 'cake'
print(f'{insert_me}')
Выход:
cake
Мы не можем сделать это:
123 = 'cake' # illegal variable definition
print(f'{123}')
Поэтому Python интерпретирует 123
в фигурных скобках как целочисленный литерал и печатает '123'
.
Это имеет смысл! print() ищет кортеж позиционных переменных только для того, чтобы обнаружить, что он достиг конца и невозможно получить vars[123].
@kakyo Я понял, что настолько увлекся объяснением причины, что забыл ответить на ваш конкретный вопрос. Да, это именно так.
Вы можете применить его следующим образом
print('{} is 123 value'.format(*d))
Он может работать как для Python2, так и для Python3.
Я бы порекомендовал вам проверить этот отвечать