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.