Как вы можете использовать имя переменной внутри спецификатора формата Python

Можно ли использовать переменную внутри спецификатора форматирования строки Python?

Я пытался:

display_width = 50
print('\n{:^display_width}'.format('some text here'))

но получить ValueError: Invalid format specifier. Я также пробовал display_width = str(50)

однако просто ввод print('\n{:^50}'.format('some text here')) работает нормально.


person Christopher Pearson    schedule 14.03.2015    source источник


Ответы (4)


Да, но вы должны передать их в качестве аргументов в format, а затем ссылаться на них, обернутых в {}, как если бы вы ссылались на само имя аргумента:

print('\n{:^{display_width}}'.format('some text here', display_width=display_width))

Или короче, но чуть менее явно:

print('\n{:^{}}'.format('some text here', display_width))

Поскольку этот вопрос был первоначально опубликован, Python 3.6 добавил f-строки, которые позволяют вам делать это без использования метода format, и он использует переменные, которые находятся в области видимости, вместо того, чтобы передавать именованные переменные в качестве аргументов ключевого слова:

display_width = 50
text = 'some text here'
print(f'\n{text:^{display_width}}')
person Brian Campbell    schedule 14.03.2015
comment
Ага, вот оно! На самом деле я использовал ваш второй вариант, но добавил идентификаторы, чтобы сделать его более явным: print('\n{0:^{1}}'.format('some text here', display_width)). Это позволило мне быть немного более творческим, как в цикле for: print(('{0:>{2}} : {1:<}').format(k, v, width_adj)), где width_adj = display_width//2 - 2. - person Christopher Pearson; 14.03.2015
comment
@ChristopherPearson Да, это выглядит довольно разумным способом сделать это. - person Brian Campbell; 14.03.2015
comment
В примечании python.org/dev/peps/pep-3101 упоминается ^ для выравнивания по центру, > для выравнивания по правому краю и < для выравнивания по левому краю - person depperm; 01.12.2016
comment
есть ли способ сделать это, используя форматированную строковую идиому 3.6 f"..."? - person steffen; 10.09.2017
comment
Первый вариант у меня не работал в 3.6.1, но вторая версия (переменная как аргумент для форматирования) работает нормально. Это ожидаемое поведение для 3.6? - person Omortis; 09.10.2017
comment
@Omortis Первый вариант отлично работает для меня в Python 3.6. display_width = 50; print('\n{:^{display_width}}'.format('some text here', display_width=display_width)). Можете показать код, который у вас не работает? - person Brian Campbell; 11.10.2017
comment
@steffen Ответ «да», см. stackoverflow.com/a/60838497/5693642 - person Chang Ye; 25.03.2020
comment
@steffen обновил мой ответ, включив в него f-строки - person Brian Campbell; 25.03.2020

F-строка Python более гибкая.

>>> display_width = 50
>>> display_content = "some text here"
>>> print(f'\n{display_content:^{display_width}}')

                  some text here
person Chang Ye    schedule 24.03.2020

Похоже, что с тех пор, как этот вопрос был впервые опубликован, python представил f-строки. Для получения информации см. эту веб-страницу.

>>> name = 'Fred'
>>> age = 42
>>> f'He said his name is {name} and he is {age} years old.'
He said his name is Fred and he is 42 years old.
person Bolton Bailey    schedule 09.02.2020

Может быть

print(('{0:^'+str(display_width)+'}').format('hello'))
person shooper    schedule 14.03.2015