web-dev-qa-db-ja.com

スター(アスタリスク)はf-stringで何をしますか?

pythonドキュメント 2.4.3。フォーマットされた文字列リテラル では、fストリングの{}、しかし、私はそれを使用する方法を見つけることができません。

それは何ですか、どうすれば使用できますか?どこかに文書化されていますか?

正確には、これは次の [〜#〜] bnf [〜#〜]"*" or_expr部分に関するものです。

f_string          ::=  (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::=  "{" f_expression ["!" conversion] [":" format_spec] "}"
f_expression      ::=  (conditional_expression | "*" or_expr)
                         ("," conditional_expression | "," "*" or_expr)* [","]
                       | yield_expression

REPLで試しましたが、エラーが発生します。

>>> l = [1, 2, 3]
>>> f"{l}"
'[1, 2, 3]'
>>> f"{*l}"
  File "<stdin>", line 1
SyntaxError: can't use starred expression here
17

f_expressionには2つの選択肢があります。オプションでアスタリスクを前に付けたor_expressionsのコンマ区切りリスト、または単一のyield_expressionです。 yield_expressionではアスタリスクを使用できないことに注意してください。

私は、コンマ区切りのリストの選択肢は少なくとも1つのコンマがある場合にのみ選択されることを意図していたと思いますが、文法は実際にはそれを述べていません。最後の反復演算子は+ではなく*である必要があるように感じます。

したがって、f"{*1}"はアスタリスクがあるがコンマがないため、構文エラーになります。 f"{*1,*2}"は構文的には有効ですが、1と2は反復できないため、型エラーになります。 f"{*[1], *[2]}"は有効であり、f"{1,2}"と同じように機能します。したがって、アスタリスクはタプルのスプラット演算子として機能するため、許可されます。これは、f式で括弧なしで記述できます。

or_expr*のオペランドとして使用しても、ビット単位のOR演算子をそこで使用する必要があるという意味ではありません。ビット単位のOR演算子が優先順位階層の最初の演算子であることを意味しますこれは、*のオペランドとして許可されます。つまり、接頭辞*と他の式の優先順位を設定するだけです。 or_expressionは、文法のあらゆる場所でプレフィックス*のオペランドとして一貫して使用されていると思います(つまり、プレフィックス*の後にパラメーター名ではなく式が続くすべての場所)。

9
sepp2k