Tại sao f '{{74}}}' giống với f '{{74}}' với f-String?


109

Chuỗi f có sẵn từ Python 3.6 và rất hữu ích để định dạng chuỗi:

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

Đọc thêm về chúng trong f-String của Python 3: Cú pháp định dạng chuỗi cải tiến (Hướng dẫn) . Tôi tìm thấy một mô hình thú vị:

Lưu ý rằng việc sử dụng ba dấu ngoặc nhọn sẽ dẫn đến việc chỉ có các dấu ngoặc đơn trong chuỗi của bạn:

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

Tuy nhiên, bạn có thể nhận được nhiều dấu ngoặc nhọn hơn nếu bạn sử dụng nhiều hơn ba lần niềng răng:

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

Và đây chính xác là trường hợp:

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

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

Bây giờ nếu chúng ta truyền từ hai {đến ba, kết quả là như nhau:

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

Vì vậy, chúng tôi cần tới 4! ( {{{{) để có được hai dấu ngoặc nhọn như một đầu ra:

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

Tại sao lại thế này? Điều gì xảy ra với hai lần niềng răng để Python yêu cầu thêm một lần nữa kể từ thời điểm đó?


70
Nó có thể được chiếu sáng để so sánh kết quả của f"{{2+2}}"f"{{{2+2}}}", đó là '{2+2}''{4}'tương ứng
Kevin

3
@Kevin tuyệt vời. Thật buồn cười khi f'{2+2}'trả về 4, f'{{2+2}}'trả về 2 + 2, f'{{{2+2}}}'{4}, f'{{{{2+2}}}}'{{2 + 2}}, v.v. Nó có ý nghĩa nhưng đánh đố một chút về cái nhìn đầu tiên.
fedorqui 'SO ngừng làm hại'

2
Nói một cách đơn giản, đó là vì f'{74}'nó giống như f'74'.
kaya3

1
Đây không phải là bất cứ điều gì mới với chuỗi f, cũ str.formatcũng làm điều này.
Peilonrayz

@Peilonrayz thế nào? "{74}".format(...)sẽ yêu cầu một chuỗi có ít nhất 74 phần tử.
gerrit

Câu trả lời:


118

Niềng răng đôi thoát khỏi niềng răng, do đó không có suy sẽ xảy ra: {{{, và }}}. Và 74vẫn là một chuỗi không thay đổi '74',.

Với niềng răng ba, niềng răng đôi bên ngoài được thoát ra, giống như trên. Mặt khác, các dấu ngoặc trong, dẫn đến phép nội suy chuỗi thông thường của giá trị 74.

Đó là, chuỗi f'{{{74}}}'tương đương f'{{ {74} }}', nhưng không có khoảng trắng (hoặc, tương đương, đến '{' + f'{74}' + '}').

Bạn có thể thấy sự khác biệt khi thay thế hằng số bằng một biến:

In [1]: x = 74

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

In [3]: f'{{{x}}}'
Out[3]: '{74}'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.