ฉันจะสร้างสตริง Python หลายบรรทัดที่มีตัวแปรอินไลน์ได้อย่างไร


109

ฉันกำลังมองหาวิธีที่สะอาดในการใช้ตัวแปรภายในสตริง Python หลายบรรทัด สมมติว่าฉันต้องการทำสิ่งต่อไปนี้:

string1 = go
string2 = now
string3 = great

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

ฉันต้องการดูว่ามีบางอย่างที่คล้ายกับ$ใน Perl เพื่อระบุตัวแปรในไวยากรณ์ Python หรือไม่

ถ้าไม่ - วิธีใดที่ง่ายที่สุดในการสร้างสตริงหลายบรรทัดพร้อมตัวแปร

คำตอบ:


166

วิธีทั่วไปคือformat()ฟังก์ชัน:

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

ทำงานได้ดีกับสตริงรูปแบบหลายบรรทัด:

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

คุณยังสามารถส่งพจนานุกรมพร้อมตัวแปร:

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

สิ่งที่ใกล้เคียงกับสิ่งที่คุณถาม (ในแง่ของไวยากรณ์) เป็นสตริงแม่แบบ ตัวอย่างเช่น:

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

ฉันควรเพิ่มแม้ว่าformat()ฟังก์ชั่นจะธรรมดากว่าเพราะพร้อมใช้งานและไม่ต้องใช้บรรทัดการนำเข้า


2
สามารถใช้vars()หรือlocals()เป็นพจนานุกรมที่มีปัญหาได้
Ismail Badawi

2
@isbadawi Explicit ดีกว่าโดยนัย ดีกว่าที่จะส่งเฉพาะตัวแปรที่คุณต้องการ หากคุณไม่ทราบว่าคุณต้องการเพราะสตริงเป็นที่จัดทำโดยผู้ใช้ที่ "ตัวแปร" ควรเป็นรายการในdictอยู่แล้ว
agf

วิธีที่สองคือ IMO ที่สะอาดที่สุด พจนานุกรมพร้อมด้วยชื่อตัวแปรที่ชัดเจนจากพจนานุกรมภายใน multiline sting ฉันจะใช้วิธีนี้ ขอบคุณ. คำตอบที่ยอดเยี่ยมมากมายด้านล่างด้วย แต่นี่ก็สมบูรณ์แบบ
วิวัฒนาการ

@SimeonVisser, "string" .format (... ) ไม่ถูกต้องในเวอร์ชัน python แบบเดิม (เช่น 2.4)
Oz123

1
{{this}}ถ้าใช้วงเล็บปีกกาที่พวกเขาต้องการที่จะหนีออกมาเช่น
จอนนี่

57

หมายเหตุ : วิธีที่แนะนำที่จะทำรูปแบบสตริงในหลามคือการใช้งานformat()ที่ระบุไว้ในคำตอบที่ได้รับการยอมรับ ฉันขอสงวนคำตอบนี้ไว้เป็นตัวอย่างของไวยากรณ์สไตล์ C ที่รองรับด้วย

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

การอ่านบางส่วน:


2
สิ่งนี้ไม่เหมือนกันจริงๆเพราะ OP ต้องการพารามิเตอร์ที่มีชื่อไม่ใช่ตำแหน่ง
Ismail Badawi

2
ยังคงเป็นทางออกที่ดีและสำหรับการแก้ไขแบบหลายบรรทัดจะตรงกว่า คุณไม่จำเป็นต้องนำเข้าอะไรและใช้การแก้ไขไพ ธ อนปกติ
unflores

4
" คุณอาจจะตอบคำถามนี้ด้วย Googling สักหน่อย " หมายความว่าเราไม่พบโพสต์นี้หลังจาก Googling ...
Stevoisiak

34

คุณสามารถใช้f-strings ของ Python 3.6สำหรับตัวแปรภายในสตริงบรรทัดเดียวแบบหลายบรรทัดหรือแบบยาว \nคุณสามารถระบุตัวอักษรขึ้นบรรทัดใหม่โดยใช้

ตัวแปรในสตริงหลายบรรทัด

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)

ฉันจะไปที่นั่น
ฉันจะไปให้
ดี

ตัวแปรในสตริงบรรทัดเดียวที่มีความยาว

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

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

print(singleline_string)

ฉันจะไปที่นั่น. ฉันจะไปเดี๋ยวนี้ เยี่ยมมาก


หรือคุณยังสามารถสร้าง f-string แบบหลายบรรทัดพร้อมด้วยเครื่องหมายคำพูดสามคำ

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

สิ่งนี้ช่วยให้ซอร์สโค้ดของคุณดูสวยและในก่อน Python3.6 คุณจะได้รับเอฟเฟกต์เดียวกันเพียงแค่ทำสิ่งนี้ (ชุดวงเล็บพิเศษและใช้+เพื่อเชื่อมต่อกัน): stackoverflow.com/a/54564926/4561887
Gabriel Staples

การเสนอราคาสามครั้งเป็นที่ต้องการอย่างมาก คุณควรนำเสนอแบบฟอร์มนั้นก่อน
jpmc26

@ jpmc26 ผมนำเสนอวงเล็บสไตล์แรกขึ้นอยู่กับแนวทาง PEP 8 รหัสเยื้อง เหตุใดจึงควรใช้การเสนอราคาสามครั้ง
Stevoisiak

10

นี่คือสิ่งที่คุณต้องการ:

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

โปรดทราบว่าเครื่องหมายคำพูดสามคำจะ"""รักษาขึ้นบรรทัดใหม่ซึ่งหมายความว่าจะมีการขึ้นบรรทัดใหม่ก่อนและหลังmystring
Stevoisiak

คุณสามารถใช้.strip(), .rstrip()หรือ.lstrip()หรือ UE ฟันเฟืองภายในสามคำพูดที่จะหลีกเลี่ยงการสร้างขึ้นบรรทัดใหม่ mystring = "" "\ ABC \" ""
Havok

7

สามารถส่งผ่านพจนานุกรมไปยังformat()ชื่อคีย์แต่ละชื่อจะกลายเป็นตัวแปรสำหรับแต่ละค่าที่เกี่ยวข้อง

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

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

print(multiline_string)


นอกจากนี้ยังสามารถส่งผ่านรายการไปยังformat()หมายเลขดัชนีของแต่ละค่าจะถูกใช้เป็นตัวแปรในกรณีนี้

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

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

print(multiline_string)


โซลูชันทั้งสองข้างต้นจะให้ผลลัพธ์เหมือนกัน:

ฉันจะไปที่นั่น
ฉันจะไปให้
ดี


4

f-stringsเรียกอีกอย่างว่า "ตัวอักษรสตริงที่จัดรูปแบบ" เป็นตัวอักษรสตริงที่มีfจุดเริ่มต้น และวงเล็บปีกกาที่มีนิพจน์ซึ่งจะถูกแทนที่ด้วยค่า

f-strings ถูกประเมินที่รันไทม์

ดังนั้นโค้ดของคุณจึงสามารถเขียนใหม่ได้โดย:

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

และสิ่งนี้จะประเมินเป็น:

I will go there
I will go now
great

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับมันนี่


1

หากใครมาที่นี่จากไคลเอนต์ python-graphql ที่กำลังมองหาวิธีการส่งผ่านวัตถุเป็นตัวแปรนี่คือสิ่งที่ฉันใช้:

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

 query = gql(query)

อย่าลืมปิดวงเล็บปีกกาเหมือนที่ทำ: "{{", "}}"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.