Bagaimana cara membuat string Python multiline dengan variabel inline?

102

Saya mencari cara yang bersih untuk menggunakan variabel dalam string Python multiline. Katakanlah saya ingin melakukan hal berikut:

string1 = go
string2 = now
string3 = great

"""
I will $string1 there
I will go $string2
$string3
"""

Saya ingin melihat apakah ada sesuatu yang mirip dengan $di Perl untuk menunjukkan variabel dalam sintaks Python.

Jika tidak - apa cara terbersih untuk membuat string multiline dengan variabel?

evolusi
sumber

Jawaban:

158

Cara yang umum adalah format()fungsinya:

>>> s = "This is an {example} with {vars}".format(vars="variables", example="example")
>>> s
'This is an example with variables'

Ini berfungsi dengan baik dengan string format multi-baris:

>>> s = '''\
... This is a {length} example.
... Here is a {ordinal} line.\
... '''.format(length='multi-line', ordinal='second')
>>> print(s)
This is a multi-line example.
Here is a second line.

Anda juga dapat mengirimkan kamus dengan variabel:

>>> d = { 'vars': "variables", 'example': "example" }
>>> s = "This is an {example} with {vars}"
>>> s.format(**d)
'This is an example with variables'

Hal yang paling dekat dengan apa yang Anda tanyakan (dalam hal sintaksis) adalah string template . Sebagai contoh:

>>> from string import Template
>>> t = Template("This is an $example with $vars")
>>> t.substitute({ 'example': "example", 'vars': "variables"})
'This is an example with variables'

Saya harus menambahkan bahwa format()fungsinya lebih umum karena sudah tersedia dan tidak memerlukan baris impor.

Simeon Visser
sumber
2
Bisa menggunakan vars()atau locals()sebagai kamus yang dimaksud
Ismail Badawi
2
@isbadawi Eksplisit lebih baik daripada implisit. Lebih baik berikan hanya variabel yang Anda butuhkan. Jika Anda tidak tahu mana yang Anda butuhkan, karena string disediakan oleh pengguna, "variabel" haruslah item dalam a dict.
agf
Solusi kedua adalah IMO terbersih. Kamus bersama dengan nama variabel yang jelas dari kamus dalam multiline sting. Saya akan menggunakan metode ini. Terima kasih. Banyak jawaban bagus di bawah juga, tetapi ini sempurna.
evolusi
@SimeonVisser, "string" .format (...) tidak valid pada versi python lama (mis. 2.4)
Oz123
Jika menggunakan tanda kurung kurawal, tanda kurung kurawal harus dilepaskan seperti {{this}}.
Jonny
54

CATATAN : Cara yang disarankan untuk melakukan pemformatan string dengan Python adalah dengan menggunakan format(), seperti yang diuraikan dalam jawaban yang diterima . Saya mempertahankan jawaban ini sebagai contoh sintaks C-style yang juga didukung.

# NOTE: format() is a better choice!
string1 = "go"
string2 = "now"
string3 = "great"

s = """
I will %s there
I will go %s
%s
""" % (string1, string2, string3)

print(s)

Beberapa bacaan:

David Cain
sumber
2
Ini tidak benar-benar sama karena OP menginginkan parameter bernama, bukan yang posisional.
Ismail Badawi
2
Ini masih merupakan solusi yang bagus, dan untuk interpolasi multi-garis, ini lebih langsung. Anda tidak perlu mengimpor apa pun dan ini menggunakan interpolasi python biasa.
melepaskan bunga
4
" Anda mungkin bisa menjawab yang ini dengan sedikit Googling " Menyiratkan bahwa kami tidak menemukan posting ini setelah Googling ...
Stevoisiak
32

Anda dapat menggunakan f-string Python 3.6 untuk variabel di dalam string multi-baris atau satu baris yang panjang. Anda dapat menentukan karakter baris baru secara manual menggunakan\n .

Variabel dalam string multi-baris

string1 = "go"
string2 = "now"
string3 = "great"

multiline_string = (f"I will {string1} there\n"
                    f"I will go {string2}.\n"
                    f"{string3}.")

print(multiline_string)

Aku akan pergi ke sana
aku akan pergi sekarang
besar

Variabel dalam string satu baris yang panjang

string1 = "go"
string2 = "now"
string3 = "great"

singleline_string = (f"I will {string1} there. "
                     f"I will go {string2}. "
                     f"{string3}.")

print(singleline_string)

Aku akan ke sana. Aku akan pergi sekarang. Bagus.


Cara lainnya, Anda juga dapat membuat f-string multiline dengan tanda kutip tiga.

multiline_string = f"""I will {string1} there.
I will go {string2}.
{string3}."""
Stevoisiak
sumber
Ini membuat kode sumber Anda terlihat cantik, dan di pra-Python3.6 Anda bisa mendapatkan efek yang sama hanya dengan melakukan ini (set tambahan tanda kurung dan menggunakan +untuk menggabungkan): stackoverflow.com/a/54564926/4561887
Gabriel Staples
Kutipan tiga kali lebih disukai. Anda harus mempresentasikan formulir itu terlebih dahulu.
jpmc26
@ jpmc26 Saya menyajikan gaya tanda kurung terlebih dahulu berdasarkan pedoman PEP 8 untuk lekukan kode . Mengapa kutipan tiga lebih disukai?
Stevoisiak
10

Inilah yang Anda inginkan:

>>> string1 = "go"
>>> string2 = "now"
>>> string3 = "great"
>>> mystring = """
... I will {string1} there
... I will go {string2}
... {string3}
... """
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, 'string3': 'great', '__package__': None, 'mystring': "\nI will {string1} there\nI will go {string2}\n{string3}\n", '__name__': '__main__', 'string2': 'now', '__doc__': None, 'string1': 'go'}
>>> print(mystring.format(**locals()))

I will go there
I will go now
great
Havok
sumber
Perhatikan bahwa tanda kutip tiga """mempertahankan baris baru, yang berarti ada baris baru ekstra sebelum dan sesudahmystring
Stevoisiak
Anda dapat menggunakan .strip(), .rstrip()atau .lstrip(), atau melakukan serangan balik di dalam tanda kutip tiga untuk menghindari pembuatan baris baru. mystring = "" "\ ABC \" ""
Havok
6

Kamus dapat diteruskan ke format() , setiap nama kunci akan menjadi variabel untuk setiap nilai terkait.

dict = {'string1': 'go',
        'string2': 'now',
        'string3': 'great'}

multiline_string = '''I'm will {string1} there
I will go {string2}
{string3}'''.format(**dict)

print(multiline_string)


Juga daftar dapat diteruskan ke format() , nomor indeks dari setiap nilai akan digunakan sebagai variabel dalam kasus ini.

list = ['go',
        'now',
        'great']

multiline_string = '''I'm will {0} there
I will go {1}
{2}'''.format(*list)

print(multiline_string)


Kedua solusi di atas akan menghasilkan yang sama:

Aku akan pergi ke sana
aku akan pergi sekarang
besar

sampah
sumber
1

f-string , juga disebut "literal string yang diformat", adalah literal string yang memiliki ekstensif di awal; dan tanda kurung kurawal berisi ekspresi yang akan diganti dengan nilainya.

f-string dievaluasi saat runtime.

Jadi kode Anda dapat ditulis ulang sebagai:

string1="go"
string2="now"
string3="great"
print(f"""
I will {string1} there
I will go {string2}
{string3}
""")

Dan ini akan dievaluasi menjadi:

I will go there
I will go now
great

Anda dapat mempelajarinya lebih lanjut di sini .

Anshika Singh
sumber
0

Jika ada yang datang ke sini dari klien python-graphql mencari solusi untuk mengirimkan objek sebagai variabel, inilah yang saya gunakan:

query = """
{{
  pairs(block: {block} first: 200, orderBy: trackedReserveETH, orderDirection: desc) {{
    id
    txCount
    reserveUSD
    trackedReserveETH
    volumeUSD
  }}
}}
""".format(block=''.join(['{number: ', str(block), '}']))

 query = gql(query)

Pastikan untuk menghilangkan semua tanda kurung kurawal seperti yang saya lakukan: "{{", "}}"

Radu Ciobanu
sumber