名前付きパラメーターの文字列フォーマット?


134

私はそれが本当に簡単な質問であることを知っていますが、それをググる方法がわかりません。

どのようにできるのか

print '<a href="%s">%s</a>' % (my_url)

それでmy_url2回使用されますか?私は「名前」を付け、%s次にparamsでdictを使用する必要があると思いますが、正しい構文がわかりませんか?


参考までにmy_url、パラメーターで2回だけ使用できることは知っていますが、それはポイントではありません:)


質問のタイトルは少し誤解を招くものです。これは、文字列補間がどのように機能するかだけで、printステートメントとは関係ありません。
グレッグボール

グーグルする方法がわからない場合は、ここでsearch:python.org/docを使用してください。1つの重要な理由で、Googleよりも優れています。
S.Lott

回答:


79

Python 2.6+およびPython 3では、新しい文字列フォーマット方法を使用することを選択する場合があります。

print('<a href="{0}">{0}</a>'.format(my_url))

議論を繰り返すことからあなたを救う

print('<a href="{url}">{url}</a>'.format(url=my_url))

名前付きパラメーターが必要な場合。

print('<a href="{}">{}</a>'.format(my_url, my_url))

これは厳密に定位置であり、format()引数はPythonの規則に従うという警告のみが付いています。名前のない引数が最初に続き、名前付きの引数が続き、次に* args(リストまたはタプルのようなシーケンス)、次に* kwargs(dictあなたにとって何が良いか知っているなら、文字列でキーイングされます)。内挿点は、最初にラベルの名前付きの値を置き換えることによって決定され、次に残っているものから位置が決まります。だから、これもできる...

print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))

しかし、これは...

print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))

++から#への影響の変化を見るのは素晴らしいことです
cod3monk3y 2014年

3
上記の方法は名前付き文字列のフォーマット用ではありませんが、これは位置文字列のフォーマットです。だからこれは本当に質問に答えません。
jaapz 14年

"literal {arg1}".format(arg1="arg!")terserが一方命名フォーマットは、Pythonの3.5で動作するf"literal {arg1}"Pythonの3.6またはそれ以降、私の知る限りでは、新しい技術革新です。
MarkHu

218
print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}

3
私はkwargsでディクテーションを作成することを好みます:'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
schlamar 2013年

11
なぜあなたはそのシュムラーマーを好むのかしら?OPが使用する通常の
口述

1
ドキュメントには、これが導入された時に言っていないので、全てのPython 2のバージョンでは、おそらくです。
Evgeni Sergeev

2
可能であれば、format()を使用してください。必要な場合は%を使用してください。
uchuugaka 2017

39

Python 3.6以降のソリューション

Python 3.6はリテラル文字列フォーマットを導入しているため、文字列の外側の名前付きパラメーターを繰り返すことなく名前付きパラメーターをフォーマットできます。

print(f'<a href="{my_url:s}">{my_url:s}</a>')

これはを評価my_urlするため、定義されていない場合はを取得しNameErrorます。実際、の代わりにmy_url、(:sフォーマットコードのため)文字列に評価される限り、任意のPython式を記述できます。あなたは置き換え、文字列ではないかもしれません式の結果のための文字列表現したい場合:sにより!s事前にリテラル文字列の書式、普通のと同じように、。

リテラル文字列フォーマットの詳細については、最初に導入されたPEP 498を参照してください。


1
そのPEPはすべてのフォーマッターをカバーしているようには見えません。ここに記載されているstr.formatと同じだと思います:docs.python.org/3.4/library/string.html#formatstrings
mpen

6

あなたは構文にはまっています。

また、C#6.0では、EcmaScript開発者もこの構文を使い慣れています。

In [1]: print '{firstname} {lastname}'.format(firstname='Mehmet', lastname='Ağa')
Mehmet Ağa

In [2]: print '{firstname} {lastname}'.format(**dict(firstname='Mehmet', lastname='Ağa'))
Mehmet Ağa

5

HTMLページを作成するには、単純な文字列補間ではなく、テンプレートエンジンを使用します。


2
Djangoのテンプレートエンジンは、メールを作成するための理想的なツールである可能性もあります。
マイクグラハム、

6
Djangoテンプレートを使用して、そのrender()メソッドでメール本文を生成することを妨げている理由は何ですか?テンプレート出力をにフィードしなければならないということは何もありませんHttpResponse()。Djangoは恥ずかしいほど用途が広いです。
Mike DeSimone、2010年

1
@マイク:Djangoにもこの解決策があるかもしれないと思っていましたが、まだ見つかりませんでした:pおそらくメールをテンプレートに移動します!ありがとう。たぶん私は「遅刻した」かもしれませんが、それはいくつかの地域ではかなり厳格であることがわかりました。
mpen

2
これらのコメントを読んだ@ランダムな人々:これを行う方法の詳細については、こちらのrossp.org/blog/2006/jul/11/sending-e-mails-templates
mpen

1
質問にコメントするには、回答ではなくコメントを使用します。
2014年

2

辞書の方法と同様に、次の形式を知っておくと便利です。

print '<a href="%s">%s</a>' % (my_url, my_url)

ここでは少し冗長ですが、辞書の方法はコードを変更するときに間違いを起こしにくくなりますが、複数の挿入にタプルを使用することは可能です。最初の%sタプルの最初の要素で置換され、第二の%s組の2番目の要素のために、およびそうタプルの各要素のために置換されています。


私はこれを示唆したことを男に告げました:)彼は彼の投稿を削除しています。今ちょっと気分が悪い。はい、できることは承知していますが、探していたものではありませんでした。あなたが言ったように、それmy_urlは冗長であり、実際には私が2回評価される必要がないようにしたくない関数呼び出しです。二度はそれほど悪くはありませんが、それは簡単に20回だったかもしれません:)
mpen

5
誰かを助けるために、私は自分のものを守ろうと思った。さて、辞書の方法がおそらく最善の方法です。ただし、冗長性のために(get_my_url(), )*20、関数を1回だけ呼び出し、20回複製します。
Ponkadoodle、2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.