2012-04-11 44 views
46

Tôi đang tìm một cách sạch sẽ để sử dụng các biến trong một chuỗi Python nhiều dòng. Nói rằng tôi muốn làm như sau:Làm cách nào để tạo chuỗi Python nhiều dòng với các biến nội tuyến?

string1 = go 
string2 = now 
string3 = great 

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

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

Nếu không - cách sạch nhất để tạo chuỗi nhiều chuỗi có biến là gì?

Trả lời

70

Cách phổ biến là format() chức năng:

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

Bạn cũng có thể vượt qua một cuố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 yêu cầu (về cú pháp) là template strings. 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 thêm rằng chức năng format() phổ biến hơn vì chức năng này có sẵn và không yêu cầu đường nhập.

+2

Có thể sử dụng 'vars()' hoặc 'locals()' làm từ điển trong question –

+2

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

+0

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 sting đa dòng. Tôi sẽ sử dụng phương pháp này. Cảm ơn. Tải các câu trả lời tuyệt vời dưới đây quá nhưng điều này là hoàn hảo. – evolution

32

Có thể bạn đã trả lời câu hỏi này với một chút Googling, nhưng đây là mã bạn đang tìm kiếm. Lưu ý rằng tôi đã sửa cú pháp của bạn trên chuỗi.

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

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

print s 

Một số đọc để tìm hiểu thêm về Python chuỗi định dạng:

+2

này là không thực sự giống nhau vì OP muốn đặt tên thông số, chứ không phải vị trí. –

+0

Ah, rất tiếc. Lỗi của tôi! –

+0

Nó vẫn là một giải pháp tốt, và cho một nội suy đa dòng 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 nội suy python thường xuyên. – unflores

4

Đó là những gì bạn muốn:

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

I'm will go there 
I will go now 
great 
+0

Lưu ý rằng dấu ngoặc kép "" lưu giữ dòng mới, có nghĩa là có thêm một dòng mới trước và sau 'mystring ' –

+0

Bạn có thể sử dụng' '.strip()' ',' '.rstrip()' 'hoặc' '.lstrip()' ', hoặc ue một dấu gạch chéo ngược bên trong dấu ngoặc kép để tránh tạo một dòng mới. mystring = "" "\ ABC \ " "" – Havok

3

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

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

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

print(multiline_string) 


Cũng là một danh sách có thể được chuyển tới format(), số chỉ số của mỗi giá trị sẽ được sử dụng như các 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ẽ sản lượng như nhau:

tôi sẽ đến nơi ấy
tôi sẽ đi ngay bây giờ
lớn

2

Tôi nghĩ rằng câu trả lời trên quên {}:

from string import Template 

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

Bạn có thể sử dụng Python 3.6's f-strings cho các biến bên trong multi-line hoặc các chuỗi một dòng dài.

biến trong một chuỗi đa dòng

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

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

print(multiline_string) 

tôi sẽ đến nơi ấy
tôi sẽ đi ngay bây giờ
lớn

biến trong một chuỗi single-line 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, đối với một chuỗi nhiều đường bạn cũng có thể sử dụng ()\n

singleline_string = (f"I will {string1} there\n" 
        f"I will go {string2}.\n" 
        f"{string3}." 
        ) 
Các vấn đề liên quan