Làm thế nào tôi có thể chia dòng dài này trong Python?


176

Làm thế nào bạn sẽ đi về định dạng một dòng dài như thế này? Tôi muốn làm cho nó rộng không quá 80 ký tự:

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?

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ó?
Hamish Grubijan

2
Một chút chủ quan, phải không? :)
Adam Woś

1
có liên quan: stackoverflow.com/questions/1940710/ Mạnh (nối chuỗi trong python)
jldupont

14
Bạn có thể lưu một ký tự bằng cách xóa 'trong "nó" không chính xác.
bóng

2
indexes: Số nhiều đúng indexindices.
Scruffy

Câu trả lời:


336

Đó là một sự khởi đầu. Đó là một thực tế không tồi để xác định các chuỗi dài hơn của bạn bên ngoài mã sử dụng chúng. Đó là một cách để phân tách dữ liệu và hành vi. Tùy chọn đầu tiên của bạn là nối các chuỗi ký tự với nhau bằng cách làm cho chúng liền kề nhau:

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

Hoặc với các phần tiếp theo kết thúc dòng, dễ vỡ hơn một chút, vì điều này hoạt động:

"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."

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

Nhược điểm của việc 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ừ các biến, vì vậy mọi thứ có thể có nhiều lông hơn khi bạn cấu trúc lại. Ngoài ra, bạn chỉ có thể nội suy định dạng trên toàn bộ chuỗi kết hợp.

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

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

Rõ ràng là tốt hơn so với ngầm, 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 gấp đôi bộ nhớ: có hai bạn đã viết, cộng với một trong hai là hai chuỗi được nối với nhau, vì vậy bạn phải biết khi nào nên bỏ qua zen. Ưu điểm là bạn có thể áp dụng định dạng cho bất kỳ chuỗi con 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 chuỗi ba trích dẫn:

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

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

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

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

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


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

2
Mặc dù tất cả các câu trả lời tôi nhận được đều hữu ích, nhưng câu trả lời của bạn chắc chắn giúp tôi hiểu tất cả các cách để phá vỡ chuỗi. Có phải vấn đề với dòng "\" kết thúc là có khoảng trắng sau nó không?
Gattster

1
Tôi không thể thấy sự khác biệt ở đây, nhưng sau đó, chủ yếu là do màu cú pháp khá nguyên thủy của SO. (Một số mã hoàn toàn tốt 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.) . :-)
Ken

1
@KhurshidAlam bạn có thể sử dụng dấu ngoặc đơn 'để chứa chuỗi đó hoặc thoát dấu ngoặc kép bên trong chuỗi của bạn hoặc sử dụng dấu ngoặc kép """. Vấn đề với các chuỗi được trích dẫn có chứa các trích dẫn là như nhau cho dù bạn sử dụng một dòng đơn hay nhiều dòng để xác định chuỗi ký tự.
hugovdberg

1
Trình soạn thảo của tôi loại bỏ khoảng trắng theo dõi luôn. Tôi khuyên bạn nên kích hoạt cài đặt tương tự. Tất nhiên sau đó khoảng trắng trên dòng mới vẫn là một phần của chuỗi, vì vậy tôi đã kết thúc bằng cách sử dụng +.
ThaJay

46

Các chuỗi ký tự liên tiếp được nối bởi trình biên dịch và các biểu thức được ngoặc đơn đượ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))

11

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

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 bận tâm đấu tranh quá nhiều để làm cho mã phù hợp chính xác trong một dòng 80 cột. Thật đáng để giữ độ dài dòng xuống mức hợp lý, nhưng giới hạn 80 cứng đã là quá khứ.


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

3
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ĩ 100-120 mang lại hiệu quả cho tôi hơn 80 ký tự.
Gattster

1
Vâng, đó là về độ dài dòng tôi sử dụng, mặc dù [kinh dị! đặc quyền!] Tôi sử dụng phông chữ tỷ lệ, vì vậy độ dài dòng chính xác không quá quan trọng. Đó là trường hợp có bao nhiêu logic trên một dòng có thể đọc được hơn 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, tôi rất vui khi để nó tràn ra 120.
bobince

Phông chữ tỷ lệ cho mã - Tôi với bạn, anh trai. Đánh giá bởi sự chán ghét tất cả mọi người mà tôi từng làm việc với họ mặc dù, thế giới chưa sẵn sàng.
jlarcombe

4
~ 80 ký tự cũng giúp dễ dàng phân biệt 2 tệp cạnh nhau trên cùng một màn hình. Ngoài ra, nếu bạn gỡ lỗi một cái gì đó trong trường hợp khẩn cấp nghiêm trọng trên bảng điều khiển của máy chủ, bạn sẽ thực sự đánh giá cao giới hạn 80 ký tự! :)
Mick T

4

Bạn có thể sử dụng mô-đun textwrap để ngắt nó thành nhiều dòng

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

Từ tài liệu :

văn bản. quấn (văn bản [, chiều rộng [, ...]]) Kết
hợp một đoạn văn bản trong văn bản (một chuỗi) để mỗi dòng dài tối đa các ký tự. Trả về một danh sách các dòng đầu ra, không có dòng mới cuối cùng.

Đối số từ khóa tùy chọn tương ứng với các thuộc tính thể hiện của TextWrapper, được ghi lại dưới đây. mặc định chiều rộng đến 70.

Xem TextWrapper.wrap()phương thức để biết thêm chi tiết về cách quấn () hành xử.


2

Đối với bất kỳ ai cũng đang cố gắng gọi .format()một chuỗi dài và không thể sử dụng một số kỹ thuật gói chuỗi phổ biến nhất mà không phá vỡ .format(cuộc gọi tiếp theo , bạn có thể thực hiện str.format("", 1, 2)thay vì "".format(1, 2). Điều này cho phép bạn phá vỡ chuỗi với bất kỳ kỹ thuật nào bạn thích. Ví dụ:

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

có thể

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

Mặt khác, khả năng duy nhất là sử dụng các phần kết thúc dòng, mà cá nhân tôi không phải là người hâm mộ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.