web-dev-qa-db-ja.com

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

ケース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'

私の質問は、それが機能する理由と、この場合の名前付き引数の使用法です。

65
bkmagnetron

名前付き置換フィールド( format string{...}部分)は、 keyword arguments .format()メソッド。位置引数ではありません。

キーワード引数は、辞書のキーのようなものです。 name と照合されるため、順序は関係ありません。

positional 引数と一致させたい場合は、数字を使用します。

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

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

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

書式設定文字列は、位置 and キーワード引数の両方と一致し、引数を複数回使用できます。

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

フォーマット文字列仕様からの引用

field_name 自体は 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)

ここで、picturelinkdescriptionおよびpriceはすべてrow辞書のキーであり、はるかに簡単rowを書式設定文字列に適用するとどうなるかを確認します。

104
Martijn Pieters