Bagi mereka yang ingin menghindari menggandakan kawat gigi ( {{ }}), gunakan string.Template. Di sana Anda mengganti pengidentifikasi formulir $foo(berguna untuk menghasilkan kode LaTeX).
Ioannis Filippidis
Bagi mereka yang ingin menghindari menggandakan penyangga, dan yang tidak menolak untuk menambahkan ketergantungan lain pada proyek Python mereka, ada juga Jinja2 yang secara definitif menyelesaikan masalah ini, dengan mengijinkan sintaks pembatas placeholder kustom yang ditentukan pengguna.
String format berisi "bidang pengganti" yang dikelilingi oleh kurung kurawal {}. Apa pun yang tidak terkandung dalam kurung dianggap teks literal, yang disalin tidak berubah ke output. Jika Anda perlu memasukkan karakter kurung kurawal dalam teks literal, itu dapat dihilangkan dengan menggandakan: {{dan }}.
Jadi, jika Anda ingin mencetak "{42}", Anda akan menggunakannya "{{{0}}}".format(42)!
hughes
7
Bagaimana jika Anda ingin penahan keriting tunggal? "{ something { } {value}".format(42)tidak bekerja
AJP
14
"{{" .format () dan "}}". format () cetak kurung kurawal tunggal. Dalam contoh Anda: cetak "{{something {{}} {0}". Format (42) akan mencetak "{sesuatu {} 42".
Mark Visser
2
Apa {0}artinya?
CodyBugstein
6
@Imray: {0}merujuk pada argumen pertama .format(). Anda dapat mencetak lebih dari satu nilai seperti {0} {1} {2}selama Anda memberikan jumlah argumen yang sama .format(). Lihat docs.python.org/library/string.html#format-examples untuk contoh lengkap.
Greg Hewgill
74
Anda menghindarinya dengan menggandakan kawat gigi.
Saya mencoba memformat JSON kecil untuk beberapa tujuan, seperti ini: '{"all": false, "selected": "{}"}'.format(data)untuk mendapatkan sesuatu seperti{"all": false, "selected": "1,2"}
Sudah cukup umum bahwa masalah "pelarian kawat gigi" muncul ketika berhadapan dengan JSON.
Saya sarankan melakukan ini:
import json
data ="1,2"
mydict ={"all":"false","selected": data}
json.dumps(mydict)
Ini lebih bersih daripada alternatifnya, yaitu:
'{{"all": false, "selected": "{}"}}'.format(data)
Menggunakan jsonperpustakaan jelas lebih disukai ketika string JSON menjadi lebih rumit daripada contohnya.
Amin! Ini mungkin tampak seperti lebih banyak pekerjaan, tetapi menggunakan perpustakaan untuk melakukan apa yang seharusnya dilakukan perpustakaan dibandingkan memotong sudut ... membuat hal-hal yang lebih baik.
Kaolin Fire
1
Tetapi urutan kunci dalam objek Python tidak dijamin ... Namun, pustaka JSON dijamin serial dengan cara JSON.
wizzwizz4
2
wizzwizz4: Poin bagus. Dari Python 3.6 dan seterusnya, kamus diperintahkan penyisipan, sehingga tidak akan menjadi masalah. Versi Python antara 2.7 dan 3.5 dapat menggunakan OrderedDict dari perpustakaan koleksi.
Jika Anda akan sering melakukan ini, mungkin lebih baik untuk mendefinisikan fungsi utilitas yang akan memungkinkan Anda menggunakan pengganti brace sewenang-wenang, seperti
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}'
Perhatikan bahwa ini akan berfungsi baik dengan tanda kurung menjadi string dengan panjang 2 atau iterable dari dua string (untuk pembatas multi-karakter).
Pikirkan juga tentang itu. Tentu saja, itu akan berhasil juga dan algoritma lebih sederhana. Tapi, bayangkan Anda memiliki banyak teks seperti ini, dan Anda hanya ingin membuat parameter di sana-sini. Setiap kali Anda membuat string input, Anda tidak ingin mengganti semua kawat gigi itu secara manual. Anda hanya ingin 'memasukkan' parameterisasi Anda di sana-sini. Dalam hal ini, saya pikir metode ini lebih mudah dipikirkan dan dicapai dari perspektif pengguna. Saya terinspirasi oleh perintah 'sed' linux yang memiliki kemampuan serupa untuk secara sewenang-wenang memilih pembatas Anda berdasarkan apa yang nyaman.
tvt173
Singkatnya, saya lebih suka memiliki fungsi utilitas menjadi sedikit lebih kompleks daripada menjengkelkan di @ $$ untuk digunakan setiap kali. Tolong beri tahu saya jika saya salah memahami proposisi Anda.
Saya baru-baru ini mengalami ini, karena saya ingin menyuntikkan string ke JSON yang telah diformat sebelumnya. Solusi saya adalah membuat metode pembantu, seperti ini:
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
Saya menemukan masalah ini ketika mencoba untuk mencetak teks, yang dapat saya salin tempel ke dokumen Lateks. Saya memperluas jawaban ini dan memanfaatkan bidang pengganti bernama:
Katakanlah Anda ingin mencetak produk dari variabel mulitple dengan indeks seperti
, yang dalam Latex akan menjadi $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
. Kode berikut melakukan pekerjaan dengan bidang bernama sehingga untuk banyak indeks itu tetap dapat dibaca:
Jika Anda hanya ingin mencetak satu kurung kurawal (misalnya {) yang dapat Anda gunakan {{, dan Anda dapat menambahkan lebih banyak kurung kurawal jika Anda mau. Sebagai contoh:
>>> 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'
Ketika Anda hanya mencoba menyisipkan string kode saya sarankan menggunakan jinja2 yang merupakan mesin template berfitur lengkap untuk Python, yaitu:
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))
Jadi Anda tidak akan dipaksa untuk menduplikasi kurung kurawal seperti yang disarankan oleh seluruh jawaban lainnya
{{ }}
), gunakanstring.Template
. Di sana Anda mengganti pengidentifikasi formulir$foo
(berguna untuk menghasilkan kode LaTeX).Jawaban:
Anda harus menggandakan
{{
dan}}
:Inilah bagian yang relevan dari dokumentasi Python untuk sintaks string format :
sumber
"{{{0}}}".format(42)
!"{ something { } {value}".format(42)
tidak bekerja{0}
artinya?{0}
merujuk pada argumen pertama.format()
. Anda dapat mencetak lebih dari satu nilai seperti{0} {1} {2}
selama Anda memberikan jumlah argumen yang sama.format()
. Lihat docs.python.org/library/string.html#format-examples untuk contoh lengkap.Anda menghindarinya dengan menggandakan kawat gigi.
Misalnya:
sumber
Python 3.6+ (2017)
Dalam versi terbaru Python, orang akan menggunakan f-string (lihat juga PEP498 ).
Dengan f-string kita harus menggunakan double
{{
atau}}
menghasilkan yang diinginkan
Jika Anda perlu menyelesaikan ekspresi dalam tanda kurung alih-alih menggunakan teks literal Anda akan membutuhkan tiga set tanda kurung:
menghasilkan
sumber
OP menulis komentar ini:
Sudah cukup umum bahwa masalah "pelarian kawat gigi" muncul ketika berhadapan dengan JSON.
Saya sarankan melakukan ini:
Ini lebih bersih daripada alternatifnya, yaitu:
Menggunakan
json
perpustakaan jelas lebih disukai ketika string JSON menjadi lebih rumit daripada contohnya.sumber
Coba lakukan ini:
sumber
Coba ini:
x = "{{ Hello }} {0}"
sumber
Meskipun tidak lebih baik, hanya untuk referensi, Anda juga dapat melakukan ini:
Ini bisa bermanfaat misalnya ketika seseorang ingin mencetak
{argument}
. Mungkin lebih mudah dibaca daripada'{{{}}}'.format('argument')
Perhatikan bahwa Anda menghilangkan posisi argumen (misalnya,
{}
bukan{0}
) setelah Python 2.7sumber
Jika Anda akan sering melakukan ini, mungkin lebih baik untuk mendefinisikan fungsi utilitas yang akan memungkinkan Anda menggunakan pengganti brace sewenang-wenang, seperti
Perhatikan bahwa ini akan berfungsi baik dengan tanda kurung menjadi string dengan panjang 2 atau iterable dari dua string (untuk pembatas multi-karakter).
sumber
Saya baru-baru ini mengalami ini, karena saya ingin menyuntikkan string ke JSON yang telah diformat sebelumnya. Solusi saya adalah membuat metode pembantu, seperti ini:
Anda kemudian dapat melakukan sesuatu seperti:
Mendapat pekerjaan yang dilakukan jika kinerja tidak menjadi masalah.
sumber
Jika Anda perlu menyimpan dua kurung kurawal dalam string, Anda membutuhkan 5 kurung kurawal di setiap sisi variabel.
sumber
Alasannya,
{}
adalah sintaks dari.format()
begitu dalam kasus.format()
Anda tidak mengenali{Hello}
sehingga melemparkan kesalahan.Anda bisa menimpanya dengan menggunakan kurung kurawal ganda {{}},
atau
coba
%s
format teks,sumber
Saya menemukan masalah ini ketika mencoba untuk mencetak teks, yang dapat saya salin tempel ke dokumen Lateks. Saya memperluas jawaban ini dan memanfaatkan bidang pengganti bernama:
Katakanlah Anda ingin mencetak produk dari variabel mulitple dengan indeks seperti , yang dalam Latex akan menjadi
$A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
. Kode berikut melakukan pekerjaan dengan bidang bernama sehingga untuk banyak indeks itu tetap dapat dibaca:sumber
Jika Anda hanya ingin mencetak satu kurung kurawal (misalnya
{
) yang dapat Anda gunakan{{
, dan Anda dapat menambahkan lebih banyak kurung kurawal jika Anda mau. Sebagai contoh:sumber
Ketika Anda hanya mencoba menyisipkan string kode saya sarankan menggunakan jinja2 yang merupakan mesin template berfitur lengkap untuk Python, yaitu:
Jadi Anda tidak akan dipaksa untuk menduplikasi kurung kurawal seperti yang disarankan oleh seluruh jawaban lainnya
sumber
Anda dapat melakukan ini dengan menggunakan metode string mentah dengan hanya menambahkan karakter 'r' tanpa tanda kutip sebelum string.
sumber
\{I am inside braces\}
.