1. ホーム
  2. python

[解決済み] 文字列フォーマット:% vs. .format vs. f-stringリテラル

2022-03-17 21:24:51

質問

Python 2.6では str.format() メソッドの構文が、既存の % 演算子を使用します。どちらが良いのか、またどのような場面で使うのか?

Python 3.6 では、文字列リテラル (別名 "f" 文字列) の文字列フォーマットとして、もうひとつ f"my string" . このフォーマットオプションは他のものより優れているのでしょうか?

  1. 以下はそれぞれの方法を使い、同じ結果になっていますが、何が違うのでしょうか?

     #!/usr/bin/python
     sub1 = "python string!"
     sub2 = "an arg"
    
     sub_a = "i am a %s" % sub1
     sub_b = "i am a {0}".format(sub1)
     sub_c = f"i am a {sub1}"
    
     arg_a = "with %(kwarg)s!" % {'kwarg':sub2}
     arg_b = "with {kwarg}!".format(kwarg=sub2)
     arg_c = f"with {sub2}!"
    
     print(sub_a)    # "i am a python string!"
     print(sub_b)    # "i am a python string!"
     print(sub_c)    # "i am a python string!"
    
     print(arg_a)    # "with an arg!"
     print(arg_b)    # "with an arg!"
     print(arg_c)    # "with an arg!"
    
    
  2. さらに、Pythonで文字列のフォーマットが発生するのはどのような場合ですか?例えば、ロギングレベルがHIGHに設定されている場合、次のように実行してもヒットするでしょうか? % の操作が必要ですか?また、その場合、これを回避する方法はあるのでしょうか?

     log.debug("some debug info: %s" % some_info)
    
    

解決方法は?

最初の質問に答えると... .format は、多くの点でより洗練されているように見えます。厄介なのは % は、変数かタプルのどちらかを取ることができることです。次のようにすれば必ずうまくいくと思うでしょう。

"hi there %s" % name

それでも name がたまたま (1, 2, 3) を投げます。 TypeError . 常に印刷されることを保証するには、次のようにします。

"hi there %s" % (name,)   # supply the single argument as a single-item tuple

というのは醜いだけです。 .format には、そのような問題はありません。また、あなたが挙げた2つ目の例では .format の例の方が、見た目がずっときれいです。

なぜ使わないのですか?

  • 知らない(これを読む前の私)
  • Python 2.5と互換性があること

2番目の質問に答えると、文字列のフォーマットは他の操作と同時に行われます。Pythonは怠惰な言語ではないので、関数を呼び出す前に式を評価します。 log.debug の例では、式 "some debug info: %s"%some_info は、まず、例えば "some debug info: roflcopters are active" に渡され、その文字列は log.debug() .