2013-10-29 19 views
6

Có thể sử dụng cú pháp str.format(key=value) của Python để chỉ thay thế một số phím nhất định.Làm cách nào để thoát khỏi chuỗi định dạng?

Hãy xem xét ví dụ sau:

my_string = 'Hello {name}, my name is {my_name}!' 

my_string = my_string.format(name='minerz029') 

trả về

KeyError: 'my_name' 

Có cách nào để đạt được điều này?

Trả lời

0

Một chút của một workaround đơn giản mà tôi sử dụng:

my_string = 'Hello {name}, my name is {my_name}!' 

to_replace = { 
    "search_for" : "replace_with", 
    "name" : "minerz029", 
} 

for search_str in to_replace: 
    my_string = my_string.replace('{' + search_str + '}', to_replace[search_str]) 

print(my_string) 

này có thể được mở rộng một cách dễ dàng với nhiều phím trong to_replace dict và sẽ không phàn nàn ngay cả khi chuỗi tìm kiếm không tồn tại. Nó có lẽ có thể được cải thiện để cung cấp thêm các tính năng của .format(), nhưng nó là đủ cho tôi.

14

Bạn có thể thoát khỏi my_name sử dụng đôi dấu ngoặc nhọn, như thế này

>>> my_string = 'Hello {name}, my name is {{my_name}}!' 
>>> my_string.format(name='minerz029') 
'Hello minerz029, my name is {my_name}!' 

Như bạn có thể thấy, sau khi định dạng một lần, bên ngoài {} được lấy ra và {{my_name}} trở thành {my_name}. Nếu sau này bạn muốn định dạng my_name, bạn chỉ có thể định dạng nó một lần nữa, như thế này

>>> my_string = 'Hello {name}, my name is {{my_name}}!' 
>>> my_string = my_string.format(name='minerz029') 
>>> my_string 
'Hello minerz029, my name is {my_name}!' 
>>> my_string.format(my_name='minerz029') 
'Hello minerz029, my name is minerz029!' 
+1

Nhưng tôi cần phải có '.format()' 'my_name' sau này. – minerz029

6

Python3.2 + có format_map cho phép bạn làm điều này

>>> class D(dict): 
...  def __missing__(self, k):return '{'+k+'}' 
... 
>>> my_string = 'Hello {name}, my name is {my_name}!' 
>>> my_string.format_map(D(name='minerz029')) 
'Hello minerz029, my name is {my_name}!' 
>>> _.format_map(D(my_name='minerz029')) 
'Hello minerz029, my name is minerz029!' 

Bây giờ nó không cần thiết phải bổ sung thêm {} , chỉ các khóa bạn cung cấp cho D mới được thay thế

Vì @steveha chỉ ra, nếu bạn đang sử dụng Python3 cũ hơn, bạn vẫn có thể sử dụng

my_string.format(**D(name='minerz029')) 
+0

Tôi chỉ thử nghiệm này, và bạn không cần phải sử dụng 'str.format_map (d)'; bạn có thể sử dụng 'str.format (** d)' và nó hoạt động tốt. Tuy nhiên, '.format_map()' hiệu quả hơn vì nó không cần tạo bản sao của dict. – steveha

+0

@steveha, trong Python2 vẫn chuyển đổi nó thành 'dict', nhưng nó hoạt động tốt cho Python3 –

+0

Phải ... Tôi đã thử nghiệm trong Python3. Python2 không có '.format_map()'. Tôi chỉ có nghĩa là trong các phiên bản Python có '.format_map()' bạn thực sự có thể sử dụng 'str.format (** d)' thay vào đó và nó cũng sẽ hoạt động. Xin lỗi vì không đánh vần. – steveha

Các vấn đề liên quan