web-dev-qa-db-ja.com

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

Rubyの例:

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

Python文字列の連結が成功したことは、私にとって冗長に思えます。

311
Caste

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をローカル変数としての値にマップしました。

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

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"))
379
Sven Marnach

Python 2.6.X以降では、使いたいと思うかもしれません:

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

私は interpy パッケージを開発しました、それはPythonで文字列補間を可能にします

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}."
32

文字列補間は PEP 498で指定されているようにPython 3.6に含まれています になるでしょう。あなたはこれをすることができるでしょう:

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

私はSpongebobが嫌いなので、これを書くのは少し苦痛でした。 :)

26
kirbyfan64sos

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

26
Oleiade

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

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

4
Quan To
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

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

複製:

3
Paulo Cheque

古い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
2
Michael Fox

Python 3.6以降では、f文字列を使用した リテラル文字列補間 があります。

name='world'
print(f"Hello {name}!")
0
Alejandro Silva