x = " \{ Hello \} {0} "
print(x.format(42))
дає мені: Key Error: Hello\\
Я хочу надрукувати вихід: {Hello} 42
{{ }}
), використовуйте string.Template
. Там ви підміняєте ідентифікатори форми $foo
(зручно для генерації коду LaTeX).
x = " \{ Hello \} {0} "
print(x.format(42))
дає мені: Key Error: Hello\\
Я хочу надрукувати вихід: {Hello} 42
{{ }}
), використовуйте string.Template
. Там ви підміняєте ідентифікатори форми $foo
(зручно для генерації коду LaTeX).
Відповіді:
Вам потрібно подвоїти {{
та }}
:
>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '
Ось відповідна частина документації Python для синтаксису рядкових форматів :
Рядки формату містять "поля заміни", оточені фігурними дужками
{}
. Все, що не міститься в дужках, вважається буквальним текстом, який скопіюється без змін до виводу. Якщо вам потрібно включити дуговий символ у прямому тексті, його можна уникнути подвоєнням:{{
і}}
.
"{{{0}}}".format(42)
!
"{ something { } {value}".format(42)
не працює.
{0}
означає?
{0}
посилається на перший аргумент до .format()
. Ви можете надрукувати більше ніж одне значення, наприклад, до {0} {1} {2}
тих пір, поки ви надасте однакову кількість аргументів .format()
. Див. Docs.python.org/library/string.html#format-examples для широких прикладів.
Ви уникаєте цього, подвоюючи брекети.
Наприклад:
x = "{{ Hello }} {0}"
print(x.format(42))
Python 3.6+ (2017)
В останніх версіях Python можна було б використовувати f-рядки (див. Також PEP498 ).
Для f-рядків слід використовувати подвійний {{
або}}
n = 42
print(f" {{Hello}} {n} ")
виробляє бажане
{Hello} 42
Якщо вам потрібно розв'язати вираз у дужках, а не використовувати буквальний текст, вам знадобляться три набори дужок:
hello = "HELLO"
print(f"{{{hello.lower()}}}")
виробляє
{hello}
ОП написав цей коментар:
Я намагався відформатувати невеликий JSON для якихось цілей, як-от так:
'{"all": false, "selected": "{}"}'.format(data)
щоб отримати щось подібне{"all": false, "selected": "1,2"}
Досить часто зустрічається питання, що питання "втечі брекетів" виникає при роботі з JSON.
Я пропоную зробити це:
import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)
Це чистіше, ніж альтернатива, а саме:
'{{"all": false, "selected": "{}"}}'.format(data)
Використання json
бібліотеки, безумовно, бажано, коли рядок JSON стає складнішим, ніж приклад.
Хоча не краще, лише для довідки, ви також можете зробити це:
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
Це може бути корисно, наприклад, коли хтось хоче надрукувати {argument}
. Це, можливо, читабельніше, ніж'{{{}}}'.format('argument')
Зауважте, що після Python 2.7 пропущено позиції аргументів (наприклад, {}
замість них {0}
)
Якщо ви збираєтеся робити це багато, можливо, було б добре визначити функцію утиліти, яка дозволить вам використовувати замість них довільні замінники брекетів, наприклад
def custom_format(string, brackets, *args, **kwargs):
if len(brackets) != 2:
raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
padded = string.replace('{', '{{').replace('}', '}}')
substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
formatted = substituted.format(*args, **kwargs)
return formatted
>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'
Зауважте, що це буде працювати або в дужках, що є рядком довжиною 2, або ітерабельним двома рядками (для розділових знаків з кількома символами).
Нещодавно я натрапив на це, тому що хотів ввести струни в попередньо відформатований JSON. Моє рішення полягало в створенні хелперного методу, наприклад:
def preformat(msg):
""" allow {{key}} to be used for formatting in text
that already uses curly braces. First switch this into
something else, replace curlies with double curlies, and then
switch back to regular braces
"""
msg = msg.replace('{{', '<<<').replace('}}', '>>>')
msg = msg.replace('{', '{{').replace('}', '}}')
msg = msg.replace('<<<', '{').replace('>>>', '}')
return msg
Потім ви можете зробити щось на кшталт:
formatted = preformat("""
{
"foo": "{{bar}}"
}""").format(bar="gas")
Виконує роботу, якщо продуктивність не є проблемою.
Причина полягає в тому, {}
чи синтаксис .format()
так у вашому випадку .format()
не розпізнається, {Hello}
тому він видав помилку.
ви можете змінити це за допомогою подвійних фігурних брекетів {{}},
x = " {{ Hello }} {0} "
або
спробуйте %s
форматувати текст,
x = " { Hello } %s"
print x%(42)
Я натрапив на цю проблему, намагаючись надрукувати текст, який я можу скопіювати, вставити в документ Латекс. Я продовжую цю відповідь і використовую названі замінні поля:
Скажімо, ви хочете роздрукувати добуток змінних mulitple з такими індексами, як , наприклад
, у Latex було б $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
. Наступний код виконує завдання з названими полями, щоб для багатьох індексів він залишався читабельним:
idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))
Якщо ви хочете роздрукувати лише один фігурний брекет (наприклад {
), ви можете використовувати {{
, і ви можете додати більше дужок пізніше в рядку, якщо хочете. Наприклад:
>>> f'{{ there is a curly brace on the left. Oh, and 1 + 1 is {1 + 1}'
'{ there is a curly brace on the left. Oh, and 1 + 1 is 2'
Коли ви просто намагаєтесь інтерполювати рядки коду, я б запропонував використовувати jinja2, який є повнофункціональним механізмом шаблонів для Python, тобто:
from jinja2 import Template
foo = Template('''
#include <stdio.h>
void main() {
printf("hello universe number {{number}}");
}
''')
for i in range(2):
print(foo.render(number=i))
Таким чином, ви не будете змушені дублювати фігурні дужки, як підказує ціла купа інших відповідей
Це можна зробити за допомогою методу необробленого рядка, просто додавши символ "r" без лапок перед рядком.
# to print '{I am inside braces}'
print(r'{I am inside braces}')
\{I am inside braces\}
.