2012-06-22 48 views
9

Gần đây tôi đã xem đoạn mã sau. Nó không có giá trị vì chỉ có một dấu ngoặc đơn ba nhưng có vẻ hoạt động tốt. Bất cứ ai có thể giải thích những gì đang xảy ra ở đây?nhầm lẫn nối chuỗi python

return ("Validation failed(%s): cannot calculate length " 
     "of %s.""" % (self.name, value))` 

Trả lời

9

Tất cả các chuỗi được nối trước.

"" là một chuỗi trống.

Thay thế sau đó được thực hiện.

+1

+1 2 phút nhanh hơn – Mualig

+2

Chắc chắn không ai có thể viết mã khó hiểu như vậy. Tôi từ chối tiền đề của câu hỏi! – Felix

+1

Vì vậy, không cần khoảng trắng giữa các chuỗi được nối và chuỗi rỗng cuối cùng, được lặp lại ở một số vị trí trong mã (tôi có thể đăng một liên kết cho Felix nghi ngờ), chỉ là mã hóa kém. –

1

Khi bạn sử dụng Chuỗi trên nhiều dòng, bạn có thể thêm " để tạo đầu ra một dòng dưới dạng chuỗi được nối trước tiên. Bạn có thể đọc dòng dưới dạng:

return ("Validation failed(%s): cannot calculate length " //1st line 
    "of %s." //2nd line 
    "" % (self.name, value)) //3rd line (empty) 
0

Nếu bạn có thể sửa đổi mã, lưu ý rằng cú pháp % cho chuỗi định dạng trở nên lỗi thời. Bạn nên sử dụng str.format() nếu phiên bản của Python hỗ trợ nó:

return "Validation failed({0}): cannot calculate length of {1}.".format(self.name, value) 

Nếu nó cần để span nhiều dòng, sử dụng:

return ("Validation failed({0}): " + 
     "cannot calculate length of {1}.".format(self.name, value)) 
+0

Đây phải là một bình luận, vì nó không thực sự trả lời câu hỏi - cũng không cần đến '+', vì chính xác cùng chuỗi ký tự bằng chữ trong mã gốc. – lvc

4

Đây là Python của string literal concatenation - về cơ bản, xâu xuất hiện trực tiếp bên cạnh mỗi khác được phân tích cú pháp dưới dạng một chuỗi:

>>> 'foo' 'bar' 
'foobar' 

Trong ví dụ của bạn, bạn có ba chuỗi ký tự liên tiếp (cuối cùng là "", chuỗi rỗng) được nối theo cách này, chứ không phải là một chữ nhiều dòng đơn được chấm dứt nhưng không bắt đầu bằng dấu ngoặc kép.

+0

+1 để tham khảo tài liệu. –