1. ホーム
  2. python

Pythonでフォーマット文字列と名前付き引数

2023-08-03 03:56:05

質問

ケース1です。

"{arg1} {arg2}".format(10, 20)

これは KeyError: 'arg1' というように、名前付き引数を渡していないので

ケース2です。

"{arg1} {arg2}".format(arg1=10, arg2=20)

これで、名前付き引数を渡したので、ちゃんと動作するようになります。 そして、次のように表示されます。 '10 20'

ケース3

そして、もし間違った名前を渡すと、次のように表示されます。 KeyError: 'arg1'

"{arg1} {arg2}".format(wrong=10, arg2=20)

しかし

ケース4

で名前付き引数を渡すと 間違った順序

"{arg1} {arg2}".format(arg2=10, arg1=20)

うまくいく...

と表示されます。 '20 10'

私の質問は、なぜそれが動作し、何のために という名前の引数 をこの場合どう使うのかということです。

どのように解決するのですか?

名前付き置換フィールド ( {...} の部分を 形式の文字列 に対してマッチします。 キーワード引数 に対して .format() メソッドではなく 位置引数 .

キーワード引数は辞書のキーのようなもので、順序は関係ありません。 名前 .

に対してマッチングを行う場合 位置 引数に対してマッチしたい場合は、数字を使用します。

"{0} {1}".format(10, 20)

Python 2.7以降では、数字を省略することができます。 {} の置換フィールドは、フォーマット文字列の出現順に自動番号付けされます。

"{} {}".format(10, 20) 

フォーマット文字列は,位置指定された の両方のキーワード引数にマッチし、引数を複数回使用することができます。

"{1} {ham} {0} {foo} {1}".format(10, 20, foo='bar', ham='spam')

からの引用 フォーマット文字列の指定 :

<ブロッククオート

フィールド名 自体は arg_name のどちらかです。 数値またはキーワード . 数値の場合は位置引数を指し、キーワードの場合は名前付きキーワード引数を指します。

強調は私です。

大きなフォーマット文字列を作成する場合、名前付き置換フィールドを使用する方がはるかに読みやすく保守的であることが多いので、引数を数え上げ続け、どの引数が結果の文字列のどこに入るかを把握する必要はありません。

また **keywords の呼び出し構文を使って既存の辞書をフォーマットに適用し、CSV ファイルをフォーマットされた出力に簡単に変換することができます。

import csv

fields = ('category', 'code', 'price', 'description', 'link', 'picture', 'plans')
table_row = '''\
    <tr>
      <td><img src="{picture}"></td>
      <td><a href="{link}">{description}</a> ({price:.2f})</td>
   </tr>
'''

with open(filename, 'rb') as infile:
    reader = csv.DictReader(infile, fieldnames=fields, delimiter='\t')
    for row in reader:
        row['price'] = float(row['price'])  # needed to make `.2f` formatting work
        print table_row.format(**row)

ここで picture , link , descriptionprice はすべて row 辞書のキーであり、それは より簡単です。 を適用したときに何が起こるかを見るために row を適用するとどうなるかを見るのが簡単です。