Satır içi değişkenlerle çok satırlı bir Python dizesini nasıl oluştururum?


103

Değişkenleri çok satırlı bir Python dizesi içinde kullanmanın temiz bir yolunu arıyorum. Aşağıdakileri yapmak istediğimi varsayalım:

string1 = go
string2 = now
string3 = great

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

$Python sözdizimindeki bir değişkeni belirtmek için Perl'de benzer bir şey olup olmadığına bakıyorum .

Değilse - değişkenlerle çok satırlı bir dize oluşturmanın en temiz yolu nedir?

Yanıtlar:


159

Ortak yol format()işlevdir:

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

Çok satırlı bir biçim dizesiyle sorunsuz çalışır:

>>> 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.

Ayrıca değişkenler içeren bir sözlüğü de iletebilirsiniz:

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

İstediğiniz şeye en yakın şey (sözdizimi açısından) şablon dizeleridir . Örneğin:

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

Bununla birlikte, format()işlevin daha yaygın olduğunu da eklemeliyim çünkü kullanıma hazırdır ve bir içe aktarma satırı gerektirmez.


2
Söz konusu sözlük olarak vars()veya kullanılabilirlocals()
İsmail Badawi

2
@isbadawi Açık, örtük olmaktan daha iyidir. Yalnızca ihtiyacınız olan değişkenleri aktarmak daha iyidir. Dize kullanıcı tarafından sağlandığı için hangisine ihtiyacınız olduğunu bilmiyorsanız, "değişkenler" dictyine de bir içindeki öğeler olmalıdır .
agf

İkinci çözüm, en temiz IMO'dur. Sözlük, çok satırlı sokmanın içindeki sözlükten açık değişken adı ile birlikte. Bu yöntemi kullanacağım. Teşekkürler. Aşağıda bir sürü harika cevap var ama bu mükemmeldi.
evrim

@SimeonVisser, "string" .format (...) eski python sürümlerinde geçerli değil (örn. 2.4)
Oz123

Küme parantezi kullanılıyorsa, bunlardan kaçmaları gerekir {{this}}.
Jonny

54

NOT : Python'da dize biçimlendirmesi yapmanın önerilen yolu , kabul edilen yanıttaformat() belirtildiği gibi kullanmaktır . Bu yanıtı, desteklenen C-stili sözdiziminin bir örneği olarak saklıyorum.

# 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)

Bazı okumalar:


2
Bu aslında aynı değildir çünkü OP konumsal olanları değil adlandırılmış parametreleri ister.
Ismail Badawi

2
Hala iyi bir çözüm ve çok hatlı bir enterpolasyon için daha doğrudandır. Herhangi bir şey içe aktarmanız gerekmez ve normal python interpolasyonu kullanır.
2014

4
" Muhtemelen bunu biraz Googling ile yanıtlamış olabilirsiniz " Bu gönderiyi Googling'den sonra bulamadığımızı ima ediyor ...
Stevoisiak

32

Python 3.6'nın f dizelerini çok satırlı veya uzun tek satırlı dizelerdeki değişkenler için kullanabilirsiniz . İle yeni satır karakterlerini manuel olarak belirtebilirsiniz \n.

Çok satırlı bir dizedeki değişkenler

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)

Oraya
gideceğim, şimdi
harika gideceğim

Uzun tek satırlı bir dizede değişkenler

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

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

print(singleline_string)

Oraya gideceğim. Şimdi gideceğim. harika.


Alternatif olarak, üç tırnaklı çok satırlı bir f-dizesi de oluşturabilirsiniz.

multiline_string = f"""I will {string1} there.
I will go {string2}.
{string3}."""

Bu, kaynak kodunuzun güzel görünmesini sağlar ve Python3.6 öncesi aynı etkiyi yalnızca bunu yaparak elde edebilirsiniz (fazladan parantez seti ve +birleştirmek için kullanın): stackoverflow.com/a/54564926/4561887
Gabriel Staples

Üçlü alıntı büyük ölçüde tercih edilir. Önce bu formu sunmalısınız.
jpmc26

@ jpmc26 İlk olarak PEP 8'in kod girintisi için yönergelerine dayalı olarak parantez stilini sundum . Neden üçlü alıntı tercih edilmeli?
Stevoisiak

10

Senin istediğin bu:

>>> 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

Üçlü alıntıların """satır mystring
başlarını

Sen kullanabilirsiniz .strip(), .rstrip()ya .lstrip(), ya bir yeni satır yaratmaktan kaçınmak için üçlü tırnak içinde bir tepki ue. mystring = "" "\ ABC \" ""
Havok

6

Bir sözlüğe aktarılabilir format(), her anahtar adı ilişkili her değer için bir değişken haline gelir.

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

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

print(multiline_string)


Ayrıca bir listeye geçilebilir format(), bu durumda her bir değerin indeks numarası değişken olarak kullanılacaktır.

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

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

print(multiline_string)


Yukarıdaki her iki çözüm de aynı çıktıyı verecektir:

Oraya
gideceğim, şimdi
harika gideceğim


1

Buraya python-graphql istemcisinden bir nesneyi değişken olarak geçirmek için bir çözüm arayan biri geldiyse, işte kullandım:

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

 query = gql(query)

Benim yaptığım gibi tüm küme parantezlerinden kaçının: "{{", "}}"


1

"Biçimlendirilmiş dizge değişmezleri" olarak da adlandırılan f dizeleri , fbaşında bir harfi olan dize değişmezleridir ; ve değerleri ile değiştirilecek ifadeler içeren küme parantezleri.

f dizeleri çalışma zamanında değerlendirilir.

Böylece kodunuz şu şekilde yeniden yazılabilir:

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

Ve bu şu şekilde değerlendirilecektir:

I will go there
I will go now
great

Buradan daha fazla bilgi edinebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.