Rubyの文字列補間に相当するPythonはありますか?


343

Rubyの例:

name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."

成功したPython文字列の連結は、私には一見冗長に見えます。


2
ここでの問題は、それnameが文字列内にあるローカル変数であり、Pythonでは、ローカル変数のディクショナリを使用する場合は、それを明示的に文字列フォーマッターに渡す必要があることです。
カトリエル

これは元の問題ではありませんでしたが、ありがとうございます。あなたのコメントは私に変数スコープ(私がまだ根付いている何か)について少し理解を深めました。:)
カースト

1
では、これについてどう思いますか? stackoverflow.com/questions/16504732/...
SalchiPapa


2
参照stackoverflow.com/a/33264516/55721を 3.6にこの正確な機能のために
dss539

回答:


413

Python 3.6では、Rubyの文字列補間と同様の文字列補間が追加されます。そのバージョンのPython(2016年末までにリリースされる予定)から、「f-strings」に式を含めることができるようになります。たとえば、

name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")

3.6より前では、これに最も近いものは

name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())

この%演算子は、Pythonの文字列補間に使用できます。最初のオペランドは補間される文字列で、2番目のオペランドは「マッピング」、フィールド名を補間される値にマッピングするなど、さまざまなタイプを持つことができます。ここでは、ローカル変数の辞書を使用してlocals()、フィールド名nameをローカル変数としての値にマップしました。

.format()最近のPythonバージョンのメソッドを使用した同じコードは次のようになります。

name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))

string.Templateクラスもあります:

tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))

@Casteこちらをご覧ください:docs.python.org/library/stdtypes.html#string-formattingと、詳細が必要な場合はフォローアップコメントを投稿してください
mikej

私はそれの基本的な要旨を理解していますが、ドキュメント内の例にある追加の記号やテキストを完全には理解していません。ここで文字列への変換を使用する理由:%(language)s '03d'の3は何を意味していますか?文字列の後に%\があるのはなぜですか?print式のの変数の割り当て(実際には変数である場合)も混乱を招きます。これが苦痛ならごめんなさい!
カースト

1
この例で使用されている2つの基本的な形式%sは、文字列%03d用と、先行ゼロで3桁にパディングされた数値用です。ただ書けprint "%s has %03d" % ("Python", 2)ます。この例では、その後にマッピングキーを角かっこで囲み%ます。これは、文字列内の順序に依存するのではなく、プレースホルダーに意味のある名前を付ける方法です。次に、キー名をそれらの値にマップする辞書を渡します。そのため、Svenはlocals()すべてのローカル変数を含むdictを返す関数を使用してname、nameの値にマップします
mikej

変換タイプの必要な使用法は、最初に私を混乱させました。したがって、ドキュメントの用語を使用します。%は指定子を開始します。(言語)の変換フラグはなく、変換タイプ(末尾の「s」)のみです。(数値)には、1つ(または2つ)の変換フラグがあり、それぞれ '0'(および '3')です。「d」は変換タイプであり、整数であることを示します。私は正しく理解しましたか?
カースト

@Caste:はい、基本的にそうです。常にs変換タイプとしてaを使用できることに注意してください-Pythonはほぼすべてを文字列に変換できます。しかしもちろん、他の変換タイプの特別なフォーマット機能は失われます。
Sven Marnach、2010

143

Python 2.6.X以降、次のように使用することができます。

"my {0} string: {1}".format("cool", "Hello there!")

27
%文字列補間の演算子はPython 3.x では廃止されてません。 docs.python.org/dev/py3k/whatsnew/…3.1から廃止予定の計画を発表しました%が、これは決して起こりませんでした。
Sven Marnach、2010

8
%-syntaxは引き続きPython 3に存在します(Python 3.2以降は非推奨ではありません)
Corey Goldberg

9
ただのメモ:中の数字は{}削除できます。
2015年

32

Pythonで文字列の補間可能にするinterpyパッケージを開発しました。

だけでインストールしてくださいpip install interpy。次に、# coding: interpyファイルの先頭に行を追加します。

例:

#!/usr/bin/env python
# coding: interpy

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."

3
これは本当に安全ではないようです。
d33tah

@ d33tah:いいえ、文字列がコンパイル時にわかっている限り。
クレメント2016

28

Pythonの文字列補間はCのprintf()に似ています

あなたがしようとすると:

name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name

タグ%sname変数に置き換えられます。印刷関数タグを確認する必要があります:http : //docs.python.org/library/functions.html


1
2つの変数でこのようにするにはどうすればよいですか?
Julio Marins

16
@JulioMarinsタプルを使用しますprint "First is %s, second is %s" % (var1, var2)
kirbyfan64sos 2015年


4

あなたもこれを持つことができます

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)

http://docs.python.org/2/library/string.html#formatstrings


OP #が印刷されることを意図していたとは思わない。Ruby構文を使用しているだけです。
jaynp 2015年

あなたが正しい。回答を編集しました。Rubyに慣れていないので、#キャラクターを印刷してみようと思いました。
Quanから

3
import inspect
def s(template, **kwargs):
    "Usage: s(string, **locals())"
    if not kwargs:
        frame = inspect.currentframe()
        try:
            kwargs = frame.f_back.f_locals
        finally:
            del frame
        if not kwargs:
            kwargs = globals()
    return template.format(**kwargs)

使用法:

a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found

PS:パフォーマンスに問題がある可能性があります。これは、実稼働ログではなく、ローカルスクリプトに役立ちます。

複製:


2

古いPython(2.4でテスト済み)の場合、一番上の解決策が道を示しています。あなたはこれを行うことができます:

import string

def try_interp():
    d = 1
    f = 1.1
    s = "s"
    print string.Template("d: $d f: $f s: $s").substitute(**locals())

try_interp()

そして、あなたは得る

d: 1 f: 1.1 s: s

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.