Строка форматирования именованных параметров? - PullRequest
127 голосов
/ 16 марта 2010

Я знаю, что это действительно простой вопрос, но я не знаю, как его погуглить.

как я могу сделать

print '<a href="%s">%s</a>' % (my_url)

Так что my_url используется дважды? Я предполагаю, что должен «назвать» %s и затем использовать dict в параметрах, но я не уверен в правильном синтаксисе?


только к вашему сведению, я знаю, что могу просто использовать my_url дважды в параметрах, но это не главное:)

Ответы [ 6 ]

213 голосов
/ 16 марта 2010
print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}
67 голосов
/ 16 марта 2010

В Python 2.6+ и Python 3 вы можете выбрать более новый метод форматирования строки.

print('<a href="{0}">{0}</a>'.format(my_url))

, который избавляет вас от повторения аргумента, или

print('<a href="{url}">{url}</a>'.format(url=my_url))

, есливам нужны именованные параметры.

print('<a href="{}">{}</a>'.format(my_url, my_url))

, который является строго позиционным и поставляется только с оговоркой, что аргументы format () следуют правилам Python, где сначала должны быть указаны безымянные аргументы, за которыми следуют именованные аргументы, за которыми следует * args (последовательность, такая как list или tuple), а затем * kwargs (текст, снабженный строками, если вы знаете, что хорошо для вас).Точки интерполяции определяются сначала путем подстановки именованных значений по их меткам, а затем позиционно из того, что осталось.Итак, вы также можете сделать это ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))

Но не это ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))
34 голосов
/ 25 августа 2016

Решение в Python 3.6 +

В Python 3.6 введено форматирование буквенной строки , так что вы можете форматировать именованные параметры без повторения какого-либо из ваших именованных параметров вне строки:

print(f'<a href="{my_url:s}">{my_url:s}</a>')

Это оценит my_url, поэтому, если он не определен, вы получите NameError. Фактически вместо my_url вы можете написать произвольное выражение Python, если оно вычисляется в виде строки (из-за кода форматирования :s). Если вы хотите получить строковое представление для результата выражения, которое может не быть строкой, замените :s на !s, как и при обычном предлитеральном форматировании строки.

Подробнее о форматировании литеральных строк см. PEP 498 , где он был впервые представлен.

5 голосов
/ 02 декабря 2015

Вы будете зависимы от синтаксиса.

Также C # 6.0, разработчики EcmaScript также знакомы с этим синтаксисом.

In [1]: print '{firstname} {lastname}'.format(firstname='Mehmet', lastname='Ağa')
Mehmet Ağa

In [2]: print '{firstname} {lastname}'.format(**dict(firstname='Mehmet', lastname='Ağa'))
Mehmet Ağa
5 голосов
/ 16 марта 2010

Для построения HTML-страниц вы хотите использовать шаблонизатор, а не простую интерполяцию строк.

2 голосов
/ 16 марта 2010

Как и в словаре, может быть полезно знать следующий формат:

print '<a href="%s">%s</a>' % (my_url, my_url)

Здесь это немного избыточно, и словарный путь, безусловно, менее подвержен ошибкам при изменении кода, но все же можно использовать кортежи для нескольких вставок. Первый %s заменяет первый элемент в кортеже, второй %s заменяет второй элемент в кортеже и т. Д. Для каждого элемента в кортеже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...