2012-08-03 8 views
27

は、それを書くのは面倒です:PythonにはRubyの "string#{var}"のような変数補間がありますか? Pythonで

print "foo is" + bar + '.' 

私はpythonでこのような何かを行うことができますか?

print "foo is #{bar}."

+0

[Pythonで文字列にフォーマット番号]の可能複製(http://stackoverflow.com/questions/22617/format-numbers-to-strings-in-python) –

+0

私が思う私は、解決策を見つけましたか、あなたはそれをチェックしますか? http://stackoverflow.com/questions/16504732/how-could-i-make-my-python-string-interpolation-implementation-work-accross-impo – SalchiPapa

+0

[Rubyの文字列に相当するPythonが存在しますか補間?](https://stackoverflow.com/questions/4450592/is-there-a-python-equivalent-to-rubys-string-interpolation) – josemigallas

答えて

38

Pythonは変数展開を行いません - それは、明示的ではなく、暗黙的です。

ただし、変数に渡すstr.formatを使用することができます:私はPython Essential Referenceから、次の技術を学んだ

# Rather than this: 
puts "foo is #{bar}" 

# You would do this: 
print "foo is {}".format(bar) 

# Or this: 
print "foo is {bar}".format(bar=bar) 

# Or this: 
print "foo is %s" % (bar,) 

# Or even this: 
print "foo is %(bar)s" % {"bar": bar} 
+1

第3のものはきれいに見えますが、私はこのように推奨されない方法を覚えていますか?本当? – mko

+10

また、怠け者の 'print 'fooは%(bar)s"%locals() 'です。 –

+1

@yozloy - それはPython 3で非難されています(私はそれを理解しています)。 –

4

String formatting

>>> bar = 1 
>>> print "foo is {}.".format(bar) 
foo is 1. 
+3

またはそれより古いが、まだ一般的です:print "foo is%s"%str (bar) – Edmon

+0

PEPを見つけることはできませんが、これまでに廃止予定になっています。 – Josiah

+0

推奨されなくなりました。 –

7

>>> bar = "baz" 
>>> print "foo is {bar}.".format(**vars()) 
foo is baz. 

我々は、多くの変数を参照したいときにこれは非常に便利です書式設定文字列:

  • すべての変数を繰り返す必要はありません引き数リストに再度表示されます。明示的なキーワード引数ベースの手法(例えば、"{x}{y}".format(x=x, y=y)および"%(x)%(y)" % {"x": x, "y": y})と比較してください。
  • 引数リストの変数の順序が書式設定文字列の順序と一致するかどうかを1つずつ確認する必要はありません。位置指定の引数ベースの方法と比較してください("{}{}".format(x, y)"{0}{1}".format(x, y)"%s%s" % (x, y)など) 。
+2

であっても、' 'print 'とfooは#{bar}それはバーで渡す奇妙な方法です...かなり素敵ですが、それはより密接にルビーの方法に従います。 – Josiah

+0

これは、オブジェクトを使って作業している場合に最適なソリューションのようです。たとえば、urllib2.HTTPErrorを報告している場合、HTTPエラー:{error.code} {error.msg} "を実行できます。format(** vars())'これは ' * locals()) ' –

2

あなたが二回変数を参照することによって自分自身を繰り返す必要はありませんので、私はこのアプローチを好む:

 
alpha = 123 
print 'The answer is {alpha}'.format(**locals()) 
+0

しかし、私はそれが非常に遅いと思う - おそらくパラメタのための大きなdictを開梱。 – warvariuc

+0

@warwarukは標準出力に書くことが制限要因であり、文字列を出力するのは書式設定の10倍の時間がかかります。さらに、locals()は参照を返しますので、このメソッドはかなり速いと思います – jcr

3

Rubyでこの間には大きな違いがあります:

print "foo is #{bar}." 

はまた、これらはPythonで:

print "foo is {bar}".format(bar=bar) 

Rubyの例では、はbarはPythonのISNにルビーを変換し、あなただけの振る舞い多かれ少なかれ同じ変数を使用している辞書場合

にちょうどキーであるが、一般的には、Pythonの例では
評価され、かなり単純です。

6

Python 3。バージョン3.2 Pythonは一緒にlocals()globals()とあなたが速く行うことができますstr.format_mapを持っているので

print(f"foo is {bar}.") 

旧答え:6はintroduced f-stringsを持って

Python 3.3.2+ (default, Feb 28 2014, 00:52:16) 
>>> bar = "something" 
>>> print("foo is {bar}".format_map(locals())) 
foo is something 
>>> 
18

のPython 3.6 意志literal string interpolationであり、f -strings

print(f"foo is {bar}.") 
+2

誰かが不思議だった場合:これは 'rf 'fooのような生の文字列で、{bar}" 'です。 –

関連する問題