Dla tych, którzy chcą uniknąć podwajania nawiasów klamrowych ( {{ }}), użyj string.Template. Tam zastępujesz identyfikatory formularza $foo(przydatne do generowania kodu LaTeX).
Ioannis Filippidis
Dla tych, którzy chcą uniknąć podwajania nawiasów klamrowych i którzy nie mają nic przeciwko dodawaniu kolejnej zależności do swoich projektów w Pythonie, istnieje również Jinja2, która definitywnie rozwiązuje ten problem, umożliwiając zdefiniowaną przez użytkownika składnię ograniczników niestandardowych symboli zastępczych.
Ciągi formatujące zawierają „pola zastępcze” otoczone nawiasami klamrowymi {}. Wszystko, co nie jest zawarte w nawiasach klamrowych, jest uważane za dosłowny tekst, który jest kopiowany bez zmian do wyniku. Jeśli musisz wstawić znak nawiasu klamrowego w dosłownym tekście, można go uniknąć, podwajając: {{i }}.
Więc jeśli chcesz wydrukować „{42}”, skorzystaj "{{{0}}}".format(42)!
przytula
7
A co jeśli chcesz pojedynczy nawias klamrowy? "{ something { } {value}".format(42)nie działa
AJP
14
„{{” .format () i „}}”. format () drukuje pojedyncze nawiasy klamrowe. W twoim przykładzie: wypisz „{{coś {{}} {0}”. Format (42) wypisze „{coś {} 42”.
Mark Visser
2
Co {0}znaczy
CodyBugstein
6
@Imray: {0}odnosi się do pierwszego argumentu na .format(). Możesz wydrukować więcej niż jedną wartość, {0} {1} {2}pod warunkiem, że podasz taką samą liczbę argumentów .format(). Zobacz przykłady docs.python.org/library/string.html#format-examples .
Próbowałem sformatować mały JSON do niektórych celów, takich jak ten: '{"all": false, "selected": "{}"}'.format(data)aby uzyskać coś takiego{"all": false, "selected": "1,2"}
Podczas pracy z JSON często pojawia się problem „uciekających nawiasów klamrowych”.
Sugeruję zrobienie tego:
import json
data ="1,2"
mydict ={"all":"false","selected": data}
json.dumps(mydict)
Jest czystszy niż alternatywa, czyli:
'{{"all": false, "selected": "{}"}}'.format(data)
Korzystanie z jsonbiblioteki jest zdecydowanie lepsze, gdy łańcuch JSON staje się bardziej skomplikowany niż w przykładzie.
Amen! Może wydawać się, że to więcej pracy, ale używanie bibliotek do robienia tego, co biblioteki powinny robić, w porównaniu do wycinania rogów ... to lepsze rzeczy.
Kaolin Fire
1
Ale kolejność kluczy w obiekcie Python nie jest gwarantowana ... Mimo to biblioteka JSON gwarantuje serializację w sposób JSON.
wizzwizz4,
2
wizzwizz4: Dobra uwaga. Począwszy od Pythona 3.6, słowniki są uporządkowane według wstawiania, więc nie byłoby problemu. Wersje Pythona między wersjami 2.7 i 3.5 mogą korzystać z OrDERDict z biblioteki kolekcji.
Jeśli zamierzasz to często robić, dobrze jest zdefiniować funkcję narzędzia, która pozwoli ci zamiast tego używać dowolnych zamienników nawiasów klamrowych, takich jak
def custom_format(string, brackets,*args,**kwargs):if len(brackets)!=2:raiseValueError('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}'
Zauważ, że zadziała to z nawiasami będącymi łańcuchem o długości 2 lub iterowalnym z dwóch łańcuchów (w przypadku ograniczników wieloznakowych).
Myślałem również o tym. Oczywiście to też zadziała, a algorytm jest prostszy. Ale wyobraź sobie, że masz taki tekst i po prostu chcesz go sparametryzować tu i tam. Za każdym razem, gdy tworzysz ciąg wejściowy, nie chcesz ręcznie zamieniać wszystkich tych nawiasów klamrowych. Po prostu chcesz „wpaść” w swoje parametry tutaj i tam. W tym przypadku myślę, że ta metoda jest łatwiejsza do myślenia i osiągania z perspektywy użytkownika. Zainspirowało mnie polecenie „sed” Linuksa, które ma podobne możliwości dowolnego wyboru ogranicznika na podstawie tego, co jest wygodne.
tvt173,
Krótko mówiąc, wolałbym, aby funkcja użyteczności była nieco bardziej złożona, niż korzystanie z @ $$ za każdym razem. Daj mi znać, jeśli źle zrozumiem twoją propozycję.
Ostatnio na to wpadłem, ponieważ chciałem wstrzyknąć ciągi znaków do wstępnie sformatowanego JSON. Moim rozwiązaniem było stworzenie metody pomocniczej, takiej jak ta:
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
Natknąłem się na ten problem, próbując wydrukować tekst, który mogę skopiować wklej do dokumentu lateksowego. Opieram się na tej odpowiedzi i korzystam z nazwanych pól zastępczych:
Powiedzmy, że chcesz wydrukować produkt wielu zmiennych z indeksami takimi jak
, którym w Lateksie byłoby: $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
Poniższy kod wykonuje zadanie z nazwanymi polami, aby dla wielu indeksów był czytelny:
Jeśli chcesz wydrukować tylko jeden nawias klamrowy (na przykład {), możesz użyć {{i możesz dodać więcej nawiasów klamrowych później w ciągu, jeśli chcesz. Na przykład:
>>> 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'
Gdy próbujesz interpolować ciągi kodu, sugeruję użycie jinja2, który jest w pełni funkcjonalnym silnikiem szablonów dla Pythona, tj .:
from jinja2 importTemplate
foo =Template('''
#include <stdio.h>
void main() {
printf("hello universe number {{number}}");
}
''')for i in range(2):print(foo.render(number=i))
Więc nie będziesz zmuszony do powielania nawiasów klamrowych, jak sugeruje cała masa innych odpowiedzi
{{ }}
), użyjstring.Template
. Tam zastępujesz identyfikatory formularza$foo
(przydatne do generowania kodu LaTeX).Odpowiedzi:
Musisz podwoić
{{
i}}
:Oto odpowiednia część dokumentacji Pythona dotycząca składni ciągu formatu :
źródło
"{{{0}}}".format(42)
!"{ something { } {value}".format(42)
nie działa{0}
znaczy{0}
odnosi się do pierwszego argumentu na.format()
. Możesz wydrukować więcej niż jedną wartość,{0} {1} {2}
pod warunkiem, że podasz taką samą liczbę argumentów.format()
. Zobacz przykłady docs.python.org/library/string.html#format-examples .Uciekasz mu, podwajając nawiasy klamrowe.
Na przykład:
źródło
Python 3.6+ (2017)
W najnowszych wersjach Pythona używa się f-stringów (patrz także PEP498 ).
W przypadku strun f należy stosować podwójne
{{
lub}}
produkuje pożądane
Jeśli chcesz rozwiązać wyrażenie w nawiasach zamiast literalnego tekstu, potrzebujesz trzech zestawów nawiasów:
produkuje
źródło
OP napisał ten komentarz:
Podczas pracy z JSON często pojawia się problem „uciekających nawiasów klamrowych”.
Sugeruję zrobienie tego:
Jest czystszy niż alternatywa, czyli:
Korzystanie z
json
biblioteki jest zdecydowanie lepsze, gdy łańcuch JSON staje się bardziej skomplikowany niż w przykładzie.źródło
Spróbuj to zrobić:
źródło
Spróbuj tego:
x = "{{ Hello }} {0}"
źródło
Chociaż nie ma nic lepszego, tylko dla odniesienia, możesz również to zrobić:
Może być przydatny na przykład, gdy ktoś chce drukować
{argument}
. Być może jest bardziej czytelny niż'{{{}}}'.format('argument')
Zauważ, że pomijasz pozycje argumentów (np.
{}
Zamiast{0}
) po Pythonie 2.7źródło
Jeśli zamierzasz to często robić, dobrze jest zdefiniować funkcję narzędzia, która pozwoli ci zamiast tego używać dowolnych zamienników nawiasów klamrowych, takich jak
Zauważ, że zadziała to z nawiasami będącymi łańcuchem o długości 2 lub iterowalnym z dwóch łańcuchów (w przypadku ograniczników wieloznakowych).
źródło
Ostatnio na to wpadłem, ponieważ chciałem wstrzyknąć ciągi znaków do wstępnie sformatowanego JSON. Moim rozwiązaniem było stworzenie metody pomocniczej, takiej jak ta:
Następnie możesz zrobić coś takiego:
Wykonuje zadanie, jeśli wydajność nie stanowi problemu.
źródło
Jeśli potrzebujesz dwóch nawiasów klamrowych w ciągu, potrzebujesz 5 nawiasów klamrowych po każdej stronie zmiennej.
źródło
Powodem jest to,
{}
że składnia.format()
tak, że w twoim przypadku.format()
nie rozpoznaje,{Hello}
więc zgłosił błąd.możesz to zmienić, używając podwójnych nawiasów klamrowych {{}},
lub
spróbuj
%s
sformatować tekst,źródło
Natknąłem się na ten problem, próbując wydrukować tekst, który mogę skopiować wklej do dokumentu lateksowego. Opieram się na tej odpowiedzi i korzystam z nazwanych pól zastępczych:
Powiedzmy, że chcesz wydrukować produkt wielu zmiennych z indeksami takimi jak , którym w Lateksie byłoby:
$A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
Poniższy kod wykonuje zadanie z nazwanymi polami, aby dla wielu indeksów był czytelny:źródło
Jeśli chcesz wydrukować tylko jeden nawias klamrowy (na przykład
{
), możesz użyć{{
i możesz dodać więcej nawiasów klamrowych później w ciągu, jeśli chcesz. Na przykład:źródło
Gdy próbujesz interpolować ciągi kodu, sugeruję użycie jinja2, który jest w pełni funkcjonalnym silnikiem szablonów dla Pythona, tj .:
Więc nie będziesz zmuszony do powielania nawiasów klamrowych, jak sugeruje cała masa innych odpowiedzi
źródło
Możesz to zrobić, używając metody nieprzetworzonego ciągu, po prostu dodając znak „r” bez cudzysłowów przed ciągiem.
źródło
\{I am inside braces\}
.