Mengapa f '{{{74}}}' sama dengan f '{{74}}' dengan f-Strings?

109

f-Strings tersedia dari Python 3.6 dan sangat berguna untuk memformat string:

>>> n='you'
>>> f'hello {n}, how are you?'
'hello you, how are you?'

Membaca lebih banyak tentang mereka di Python 3 ini f-String: Sebuah Peningkatan String Format Sintaks (Guide) . Saya menemukan pola yang menarik:

Perhatikan bahwa menggunakan tiga kawat gigi akan menghasilkan hanya ada satu kawat gigi dalam string Anda:

>>> f"{{{74}}}"
'{74}'

Namun, Anda bisa mendapatkan lebih banyak kawat gigi untuk ditampilkan jika Anda menggunakan lebih dari tiga kawat gigi:

>>> f"{{{{74}}}}"
'{{74}}'

Dan inilah tepatnya masalahnya:

>>> f'{74}'
'74'

>>> f'{{74}}'
'{74}'

Sekarang jika kita beralih dari dua {menjadi tiga, hasilnya sama:

>>> f'{{{74}}}'
'{74}'           # same as f'{{74}}' !

Jadi kita membutuhkan hingga 4! ( {{{{) untuk mendapatkan dua kawat gigi sebagai output:

>>> f'{{{{74}}}}'
'{{74}}'

Kenapa ini? Apa yang terjadi dengan dua kawat gigi agar Python memerlukan satu lagi sejak saat itu?

fedorqui 'SO berhenti merugikan'
sumber
70
Mungkin sangat mencerahkan untuk membandingkan keluaran dari f"{{2+2}}"dan f"{{{2+2}}}", yang mana '{2+2}'dan '{4}'masing
Kevin
3
@Kevin hebat. Sangat lucu bagaimana f'{2+2}'mengembalikan 4, f'{{2+2}}'mengembalikan 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} dan seterusnya. Masuk akal tetapi sedikit membingungkan pada pandangan pertama.
fedorqui 'SO stop harming'
2
Sederhananya, itu karena f'{74}'sama dengan f'74'.
kaya3
1
Ini bukan sesuatu yang baru dengan f-string, yang lama str.formatjuga bagus.
Peilonrayz
@Peilonrayz Bagaimana? "{74}".format(...)akan membutuhkan urutan dengan setidaknya 74 elemen.
gerrit

Jawaban:

118

Kawat gigi ganda keluar dari kawat gigi, sehingga tidak terjadi interpolasi: {{{, dan }}}. Dan 74tetap string yang tidak berubah '74',.

Dengan kawat gigi rangkap tiga, kawat gigi rangkap luar itu diloloskan, sama seperti di atas. Kawat gigi bagian dalam, di sisi lain, menyebabkan interpolasi string nilai yang teratur 74.

Artinya, string f'{{{74}}}'sama dengan f'{{ {74} }}', tetapi tanpa spasi (atau, setara, dengan '{' + f'{74}' + '}').

Anda dapat melihat perbedaan ketika mengganti konstanta numerik dengan variabel:

In [1]: x = 74

In [2]: f'{{x}}'
Out[2]: '{x}'

In [3]: f'{{{x}}}'
Out[3]: '{74}'
Konrad Rudolph
sumber