なぜf '{{{74}}}'はf-Stringsを使用したf '{{74}}'と同じなのですか?


109

f-StringはPython 3.6から利用でき、文字列のフォーマットに非常に役立ちます。

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

それらについてPython 3のf-Stringsでさらに読む:改良された文字列フォーマット構文(ガイド)。私は興味深いパターンを見つけました:

三重中括弧を使用すると、文字列に中括弧が1つだけ含まれることに注意してください。

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

ただし、3つ以上のブレースを使用する場合は、より多くのブレースを表示できます。

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

そして、これはまさにその通りです。

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

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

2 {から3に渡しても、結果は同じです。

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

最大4つ必要です。({{{{)2つの中括弧を出力として取得するには:

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

どうしてこれなの?Pythonがその瞬間から追加のブレースを必要とするために2つのブレースで何が起こりますか?


70
それの出力を比較するために照明することができるf"{{2+2}}"f"{{{2+2}}}"され、'{2+2}'そして'{4}'それぞれ
ケビン・

3
@ケビン素晴らしいもの。奇妙なことf'{2+2}'に、4をf'{{2+2}}'返すと2 + 2 、returns f'{{{2+2}}}'{4}、f'{{{{2+2}}}}'➝{{2 + 2}}などを返します。それは理にかなっていますが、一見すると少し戸惑います。
fedorqui 'SO stop harming'

2
簡単に言えば、はとf'{74}'同じだからですf'74'
kaya3

1
これはf-stringの新しいものではなく、古き良きもの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.