2012-06-13 33 views
12

Tôi đã đoạn mã sau Python (Tôi đang sử dụng Python 2.7.X):string.Format() với placeholders tùy chọn

my_csv = '{first},{middle},{last}' 
print(my_csv.format(first='John', last='Doe')) 

tôi nhận được một ngoại lệ KeyError vì 'giữa' không được xác định (đây là kỳ vọng). Tuy nhiên, tôi muốn tất cả các trình giữ chỗ đó là tùy chọn. Nếu những tham số được đặt tên không được chỉ định, tôi hy vọng trình giữ chỗ sẽ bị xóa. Vì vậy, chuỗi được in ở trên phải là:

John,,Doe 

Có chức năng được xây dựng để làm cho các trình giữ chỗ đó không bắt buộc hoặc một số công việc chuyên sâu hơn được yêu cầu không? Nếu sau này, nếu ai đó có thể chỉ cho tôi giải pháp đơn giản nhất tôi sẽ đánh giá cao nó!

Trả lời

14

Đây là một lựa chọn:

from collections import defaultdict 

my_csv = '{d[first]},{d[middle]},{d[last]}' 
print(my_csv.format(d=defaultdict(str, first='John', last='Doe'))) 
+0

Tôi thấy bạn đang sử dụng 'str'. Cái gì thế này? Chỉnh sửa: Tôi thấy bây giờ rằng đây là phương pháp nhà máy, không phải là một tên biến. Vì vậy, nhà máy sẽ tạo ra các chuỗi trống. –

5

Đây là một lựa chọn có sử dụng các nhà điều hành chuỗi suy %:

class DataDict(dict): 
    def __missing__(self, key): 
     return '' 

my_csv = '%(first)s,%(middle)s,%(last)s' 
print my_csv % DataDict(first='John', last='Doe') # John,,Doe 

Ngoài ra, nếu bạn thích sử dụng các phương pháp hiện đại hơn str.format(), sẽ sau đây cũng hoạt động, nhưng ít tự động hơn theo nghĩa là bạn sẽ xác định rõ ràng mọi trình giữ chỗ có thể có trước (mặc dù bạn có thể sửa đổi DataDict.placeholders vào ngày thứ e-bay nếu muốn):

class DataDict(dict): 
    placeholders = 'first', 'middle', 'last' 
    default_value = '' 
    def __init__(self, *args, **kwargs): 
     self.update(dict.fromkeys(self.placeholders, self.default_value)) 
     dict.__init__(self, *args, **kwargs) 

my_csv = '{first},{middle},{last}' 
print(my_csv.format(**DataDict(first='John', last='Doe'))) # John,,Doe 
2
"It does{cond} contain the the thing.".format(cond="" if condition else " not") 

Nghĩ rằng tôi muốn thêm điều này bởi vì nó là một tính năng kể từ khi câu hỏi được hỏi, câu hỏi vẫn bật dậy sớm vào kết quả google, và phương pháp này được xây dựng trực tiếp vào cú pháp python (không cần nhập khẩu hoặc các lớp tùy chỉnh). Đó là một đơn giản shortcut conditional statement. Chúng trực quan để đọc (khi được giữ đơn giản) và thường hữu ích khi chúng short-circuit.

+0

Trong khi câu trả lời luôn được đánh giá cao, câu hỏi này đã được hỏi và trả lời 5 năm trước, và đã có một giải pháp được chấp nhận. Nó cũng thực sự giúp cung cấp một số thông tin về cách mã của bạn giải quyết vấn đề trong tầm tay. Vui lòng cung cấp một số [ngữ cảnh xung quanh câu trả lời của bạn] (https://meta.stackexchange.com/a/148274) và xem [bài viết trợ giúp] (http://stackoverflow.com/help/how-to-answer) cho thông tin về cách viết câu trả lời tuyệt vời :) –

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