เหตุใด f '{{{74}}}' จึงเหมือนกับ f '{{74}}' ด้วย f-Strings


109

f-Stringsพร้อมใช้งานจาก Python 3.6 และมีประโยชน์มากสำหรับการจัดรูปแบบสตริง:

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

อ่านเพิ่มเติมเกี่ยวกับพวกเขาในหลาม 3 F-Strings: ดีขึ้น String การจัดรูปแบบไวยากรณ์ (คู่มือ) ฉันพบรูปแบบที่น่าสนใจ:

โปรดทราบว่าการใช้การจัดฟันแบบสามครั้งจะส่งผลให้มีการจัดฟันเพียงครั้งเดียวในสตริงของคุณ:

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

อย่างไรก็ตามคุณสามารถรับเครื่องมือจัดฟันเพิ่มเติมเพื่อแสดงถ้าคุณใช้เครื่องมือจัดฟันมากกว่าสามรายการ:

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

และนี่คือกรณีที่:

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

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

ตอนนี้ถ้าเราผ่านสอง{ถึงสามผลลัพธ์ก็จะเหมือนกัน:

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

ดังนั้นเราต้องการมากถึง 4! ( {{{{) เพื่อรับวงเล็บสองอันเป็นผลลัพธ์:

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

ทำไมนี้ จะเกิดอะไรขึ้นกับการจัดฟันสองแบบเพื่อให้ Python ต้องการการเพิ่มพิเศษตั้งแต่วินาทีนั้นเป็นต้นไป


70
มันอาจจะมีความสว่างเพื่อเปรียบเทียบผลลัพธ์ของf"{{2+2}}"และf"{{{2+2}}}"ซึ่งเป็น'{2+2}'และ'{4}'ตามลำดับ
เควิน

3
@Kevin หนึ่งที่ดี มันตลกที่f'{2+2}'ผลตอบแทน 4, f'{{2+2}}'ผลตอบแทน 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} และอื่น ๆ มันสมเหตุสมผล แต่ไขปริศนานิดหน่อยตั้งแต่แรกเห็น
fedorqui 'ดังนั้นหยุดการทำร้าย'

2
ใส่เพียงเพราะมันเป็นเช่นเดียวกับf'{74}' f'74'
kaya3

1
นี่ไม่ใช่สิ่งใหม่กับ f-strings แบบเก่า ๆ ก็ดีstr.formatเช่นกัน
Peilonrayz

@Peilonrayz อย่างไร "{74}".format(...)จะต้องมีลำดับอย่างน้อย 74 องค์ประกอบ
gerrit

คำตอบ:


118

วงเล็บคู่หนีวงเล็บเพื่อให้ไม่มีการแก้ไขที่เกิดขึ้น: {{{และ➝}} }และยังคงเป็นสตริงไม่เปลี่ยนแปลง74'74'

ด้วยวงเล็บปีกกาสามอันวงเล็บปีกกาคู่นอกจะหนีออกไปเช่นเดียวกับด้านบน วงเล็บด้านบนมืออื่น ๆ 74ที่นำไปสู่การแก้ไขสตริงปกติของค่า

นั่นคือสตริงf'{{{74}}}'จะเทียบเท่ากับf'{{ {74} }}'แต่ไม่มีช่องว่าง (หรือเท่ากับ'{' + f'{74}' + '}')

คุณสามารถเห็นความแตกต่างเมื่อแทนที่ค่าคงที่ตัวเลขด้วยตัวแปร:

In [1]: x = 74

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

In [3]: f'{{{x}}}'
Out[3]: '{74}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.