Làm cách nào để tạo một chuỗi Python nhiều dòng với các biến nội tuyến?


94

Tôi đang tìm kiếm một cách rõ ràng để sử dụng các biến trong một chuỗi Python nhiều dòng. Giả sử tôi muốn làm như sau:

string1 = go
string2 = now
string3 = great

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

Tôi đang tìm xem có điều gì đó tương tự như $trong Perl để chỉ ra một biến trong cú pháp Python.

Nếu không - cách tốt nhất để tạo một chuỗi nhiều dòng với các biến là gì?

Câu trả lời:


155

Cách phổ biến là format()hàm:

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

Nó hoạt động tốt với một chuỗi định dạng nhiều dòng:

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

Bạn cũng có thể chuyển từ điển với các biến:

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

Điều gần nhất với những gì bạn đã hỏi (về mặt cú pháp) là các chuỗi mẫu . Ví dụ:

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

Tôi nên nói thêm rằng format()hàm phổ biến hơn vì nó có sẵn và không yêu cầu dòng nhập.


2
Có thể sử dụng vars()hoặc locals()như từ điển trong câu hỏi
Ismail Badawi

2
@isbadawi Rõ ràng tốt hơn là ngầm. Tốt hơn là chỉ chuyển vào các biến bạn cần. Nếu bạn không biết mình cần cái nào, bởi vì chuỗi được cung cấp bởi người dùng, "các biến" dictdù sao cũng phải là các mục .
agf

Giải pháp thứ hai là IMO sạch nhất. Từ điển cùng với tên biến rõ ràng từ từ điển trong stt nhiều dòng. Tôi sẽ sử dụng phương pháp này. Cảm ơn. Rất nhiều câu trả lời tuyệt vời bên dưới cũng nhưng điều này thật hoàn hảo.
tiến hóa

@SimeonVisser, "chuỗi" .format (...) là không hợp lệ trên các phiên bản python di sản (ví dụ 2.4)
Oz123

Nếu sử dụng dấu ngoặc nhọn, chúng cần được thoát ra như thế nào {{this}}.
Jonny

52

LƯU Ý : Cách được khuyến nghị để thực hiện định dạng chuỗi trong Python là sử dụng format(), như được nêu trong câu trả lời được chấp nhận . Tôi đang giữ câu trả lời này như một ví dụ về cú pháp kiểu C cũng được hỗ trợ.

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

Một số bài đọc:


2
Điều này không thực sự giống nhau vì OP muốn các tham số được đặt tên, không phải các tham số vị trí.
Ismail Badawi

1
Nó vẫn là một giải pháp tốt, và đối với nội suy nhiều dòng thì nó trực tiếp hơn. Bạn không phải nhập bất cứ thứ gì và nó sử dụng phép nội suy python thông thường.
mở

4
" Bạn có thể có thể đã trả lời câu này với một chút Googling " ngụ ý rằng chúng tôi không tìm thấy bài này sau khi Googling ...
Stevoisiak

30

Bạn có thể sử dụng Python 3.6 của e-dây cho các biến trong nhiều dòng hoặc các chuỗi single-line dài. Bạn có thể chỉ định các ký tự dòng mới theo cách thủ công bằng cách sử dụng \n.

Các biến trong một chuỗi nhiều dòng

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)

Tôi sẽ đến đó
tôi sẽ đi bây giờ
thật tuyệt

Các biến trong một chuỗi một dòng dài

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

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

print(singleline_string)

Tôi sẽ đến đó. Tôi sẽ đi ngay bây giờ. tuyệt quá.


Ngoài ra, bạn cũng có thể tạo một chuỗi f nhiều dòng với ba dấu ngoặc kép.

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

Điều này giữ cho mã nguồn của bạn trông đẹp mắt và trong phiên bản trước Python3.6, bạn có thể có được hiệu ứng tương tự chỉ bằng cách làm điều này (thêm bộ dấu ngoặc đơn và sử dụng +để nối): stackoverflow.com/a/54564926/4561887
Gabriel Staples

Báo giá gấp ba được ưu tiên rất nhiều . Bạn nên trình bày mẫu đơn đó trước.
jpmc26

@ jpmc26 Trước tiên, tôi đã trình bày kiểu dấu ngoặc đơn dựa trên hướng dẫn của PEP 8 về thụt lề mã . Tại sao trích dẫn ba lần lại được ưu tiên?
Stevoisiak

10

Đây là cái bạn muốn:

>>> 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ưu ý rằng dấu ngoặc kép ba """bảo tồn dòng mới, mà có nghĩa là có một newline thêm trước và saumystring
Stevoisiak

Bạn có thể sử dụng .strip(), .rstrip()hoặc .lstrip(), hoặc UE một phản ứng dữ dội bên trong dấu ngoặc kép ba để tránh tạo ra một dòng mới. mystring = "" "\ ABC \" ""
Havok

6

Một từ điển có thể được chuyển đến format(), mỗi tên khóa sẽ trở thành một biến cho mỗi giá trị liên quan.

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

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

print(multiline_string)


Ngoài ra, một danh sách có thể được chuyển đến format(), số chỉ mục của mỗi giá trị sẽ được sử dụng làm biến trong trường hợp này.

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

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

print(multiline_string)


Cả hai giải pháp trên sẽ xuất ra giống nhau:

Tôi sẽ đến đó
tôi sẽ đi bây giờ
thật tuyệt


0

Nếu có ai đó đến đây từ ứng dụng khách python-graphql đang tìm kiếm giải pháp để chuyển một đối tượng dưới dạng biến, đây là những gì tôi đã sử dụng:

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

 query = gql(query)

Đảm bảo thoát khỏi tất cả các dấu ngoặc nhọn như tôi đã làm: "{{", "}}"


0

f-string , còn được gọi là "các ký tự chuỗi được định dạng", là các ký tự chuỗi có một fở đầu; và dấu ngoặc nhọn chứa các biểu thức sẽ được thay thế bằng các giá trị của chúng.

f-string được đánh giá trong thời gian chạy.

Vì vậy, mã của bạn có thể được viết lại thành:

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

Và điều này sẽ đánh giá:

I will go there
I will go now
great

Bạn có thể tìm hiểu thêm về nó ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.