2010-01-13 30 views
103

Bạn sẽ định dạng đường dài như thế nào? Tôi muốn nhận được không quá 80 ký tự:Làm thế nào tôi có thể chia nhỏ dòng dài này bằng Python?

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title)) 

Đây có phải là lựa chọn tốt nhất của tôi không?

url = "Skipping {0} because its thumbnail was already in our system as {1}." 
logger.info(url.format(line[indexes['url']], video.title)) 
+1

Có vẻ như là một lựa chọn tốt. Bạn không thích điều gì về nó? –

+2

Một chút chủ quan, phải không? :) –

+1

liên quan: http://stackoverflow.com/questions/1940710/syntax-quirks-or-why-is-that-valid-python (chuỗi nối trong python) – jldupont

Trả lời

213

Đó là sự khởi đầu. Thực tiễn không tốt để xác định các chuỗi dài hơn bên ngoài mã sử dụng chúng. Đó là cách tách dữ liệu và hành vi. Tùy chọn đầu tiên của bạn là để tham gia xâu lại với nhau mặc nhiên bằng cách làm cho họ tiếp giáp với nhau:

("This is the first line of my text, " 
"which will be joined to a second.") 

Hoặc với dòng kết thúc continuations, đó là một chút mong manh hơn, như công trình này:

"This is the first line of my text, " \ 
"which will be joined to a second." 

Nhưng điều này không:

"This is the first line of my text, " \ 
"which will be joined to a second." 

Xem sự khác biệt? Không? Vâng, bạn sẽ không khi nó là mã của bạn.

Nhược điểm để tham gia ngầm là nó chỉ hoạt động với chuỗi ký tự, chứ không phải với chuỗi được lấy từ biến số , vì vậy mọi thứ có thể có nhiều lông hơn khi bạn refactor. Ngoài ra, bạn chỉ có thể nội suy định dạng trên chuỗi kết hợp nói chung.

Ngoài ra, bạn có thể tham gia một cách rõ ràng bằng cách sử dụng toán tử nối (+):

("This is the first line of my text, " + 
"which will be joined to a second.") 

Explicit là tốt hơn so với tiềm ẩn, như zen của python nói, nhưng điều này tạo ra ba chuỗi thay vì một, và sử dụng hai lần nhiều bộ nhớ: có hai bạn đã viết, cộng với một trong số đó là hai người trong số họ tham gia với nhau, vì vậy bạn phải biết khi nào bỏ qua zen. Ưu điểm là bạn có thể áp dụng định dạng cho bất kỳ phần nào của các phần tử riêng biệt trên mỗi dòng hoặc cho toàn bộ lô từ bên ngoài dấu ngoặc đơn.

Cuối cùng, bạn có thể sử dụng ba trích dẫn chuỗi:

"""This is the first line of my text 
which will be joined to a second.""" 

Đây thường là yêu thích của tôi, mặc dù hành vi của nó là hơi khác nhau như các dòng mới và bất kỳ khoảng trắng hàng đầu trên dòng tiếp theo sẽ hiển thị trong chuỗi thức của bạn . Bạn có thể loại bỏ dòng mới bằng dấu gạch chéo ngược thoát.

"""This is the first line of my text \ 
which will be joined to a second.""" 

Điều này có cùng vấn đề với kỹ thuật tương tự ở trên, trong mã đúng chỉ khác với mã không chính xác bởi khoảng trắng vô hình.

Điều nào là "tốt nhất" tùy thuộc vào tình huống cụ thể của bạn, nhưng câu trả lời không đơn giản là thẩm mỹ, mà là một trong những hành vi khác biệt tinh tế.

+15

Trình biên dịch CPython tối ưu hóa các hoạt động bằng chữ nhiều nhất có thể, có nghĩa là thêm hai chuỗi ký tự kết quả chỉ bằng một chuỗi ký tự duy nhất trong bytecode. –

+1

Trong khi tất cả các câu trả lời tôi nhận được đều hữu ích, bạn chắc chắn sẽ giúp tôi hiểu tất cả các cách để phá vỡ dây. Vấn đề với dòng "\" có kết thúc sau một khoảng trống không? – Gattster

+0

Tôi không thể thấy sự khác biệt ở đây, nhưng sau đó, đó là chủ yếu là do màu sắc cú pháp khá nguyên thủy của SO. (Một số mã hoàn toàn tốt là hầu như không thể đọc được trên SO, nhưng chỉ vì nó không phải là ngôn ngữ có cú pháp rất gần với C.) Không có gì lạ khi làm cho trình soạn thảo của bạn làm nổi bật dấu cách, vì chúng hiếm khi hữu ích (hoặc cố ý) . :-) – Ken

27

literals chuỗi liên tiếp được nối bởi trình biên dịch, và trong ngoặc biểu thức được coi là một dòng mã:

logger.info("Skipping {0} because it's thumbnail was " 
    "already in our system as {1}.".format(line[indexes['url']], 
    video.title)) 
7

Cá nhân tôi không thích treo khối mở, vì vậy tôi muốn định dạng nó như :

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.' 
    .format(line[indexes['url']], video.title) 
) 

Nói chung, tôi sẽ không gặp khó khăn khi làm cho mã phù hợp chính xác trong dòng 80 cột. Đó là giá trị giữ chiều dài dòng xuống đến mức hợp lý, nhưng giới hạn 80 cứng là một điều của quá khứ.

+6

Nó không thực sự là một điều của quá khứ. Thư viện chuẩn Python vẫn sử dụng PEP8 làm hướng dẫn kiểu của nó, vì vậy quy tắc vẫn tồn tại, và nhiều người (bao gồm cả tôi) theo nó. Đó là một nơi thuận tiện để vẽ đường. –

+2

Tôi tự hỏi có bao nhiêu dự án vẫn tuân theo quy tắc 80 char. Đối với kích thước cửa sổ trung bình tôi sử dụng, tôi nghĩ rằng 100-120 là hiệu quả hơn cho tôi hơn 80 ký tự. – Gattster

+1

Vâng, đó là về độ dài dòng tôi sử dụng quá, mặc dù [kinh dị! sacrilege!] Tôi sử dụng phông chữ tỉ lệ, do đó độ dài dòng chính xác không quá quan trọng. Đó là một trường hợp có bao nhiêu logic trên một dòng có thể đọc được bao nhiêu ký tự, như vậy ... nếu tôi có một chuỗi dữ liệu dài mà không ai cần đọc thì tôi rất vui khi để nó tràn qua 120. – bobince

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