web-dev-qa-db-ja.com

f '{{{74}}}'とf-{{74}} 'がf-Stringsで同じなのはなぜですか?

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

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

Python 3のf-Strings:改善された文字列フォーマット構文(ガイド) でそれらの詳細を読んでください。興味深いパターンを見つけました。

トリプルブレースを使用すると、ストリング内にシングルブレースのみが存在することに注意してください。

>>> 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}}'

どうしてこれなの? 2つのブレースでPythonが必要になった時点で追加のブレースが必要ですか?

二重中括弧は中括弧をエスケープするため、補間は行われません:{{{、および}}}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}'
117
Konrad Rudolph