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'
私の質問は、なぜそれが動作し、何のために という名前の引数 をこの場合どう使うのかということです。
どのように解決するのですか?
名前付き置換フィールド (
{...}
の部分を
形式の文字列
に対してマッチします。
キーワード引数
に対して
.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
,
description
と
price
はすべて
row
辞書のキーであり、それは
より簡単です。
を適用したときに何が起こるかを見るために
row
を適用するとどうなるかを見るのが簡単です。
関連
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] JavaScriptで複数行の文字列を作成する
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み】Bashでファイル名と拡張子を抽出する。
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] if 節の終了方法
-
[解決済み] Django filter queryset __in for *every* item in list
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?