Chuỗi f nhiều dòng trong Python


86

Tôi đang cố gắng viết mã tuân thủ PEP-8 cho một dự án trong nước (tôi phải thừa nhận rằng đó là những bước đầu tiên của tôi trong thế giới python) và tôi có một chuỗi f dài hơn 80 ký tự

- vạch liền mảnh gần dấu chấm tại self.text là dấu 80 ký tự. (Xin lỗi vì liên kết buồn không có bản xem trước nhưng tôi phải có hơn 10 đại diện để đăng 'em)

Tôi đang cố gắng để tách nó thành các dòng khác nhau trong hầu hết pythonic cách nhưng chỉ aswer đó thực sự hoạt động là một lỗi cho Linter của tôi

Mã làm việc:

def __str__(self):
    return f'{self.date} - {self.time},\nTags:' + \
    f' {self.tags},\nText: {self.text}'

Đầu ra:

2017-08-30 - 17:58:08.307055,
Tags: test tag,
Text: test text

Người viết thư cho rằng tôi không tôn trọng E122 từ PEP-8, có cách nào để lấy đúng chuỗi và tuân thủ mã không?


1
hoặc chỉ nói ide của bạn để tăng giới hạn ký tự dòng, hoặc bỏ qua quy tắc mà tất cả cùng nhau
Joran Beasley

21
Tôi không cảm thấy nó là một dupe .. fchuỗi không được thảo luận ở đó.
Ma0

3
@JoshLee "Dòng tiếp nối E122 thiếu thụt lề hoặc main bị lệch" cũng tại sao bạn đóng câu hỏi? Không có bản sao, nó là người duy nhất về multiline f-strings
Owlzy

2
@Owlzy Không phải câu trả lời hoàn toàn giống nhau: sử dụng dấu ngoặc đơn, không phải dấu tiếp tục dòng?
Nick T

8
Câu hỏi này không bao giờ được đóng lại như một bản dupe, vì 'bản dupe' được liên kết không phải là bản dupe của câu hỏi này. Stackoverflow cấp cho người dùng mà bạn biết rằng chúng tôi gặp sự cố khi quá hung hăng như thế này, hãy mở lại. Truyền một phiếu bầu mở lại càng sớm càng tốt.
Urda

Câu trả lời:


97

Từ Hướng dẫn Kiểu cho Mã Python :

Cách ưu tiên để gói các dòng dài là bằng cách sử dụng sự tiếp nối dòng ngụ ý của Python bên trong dấu ngoặc đơn, dấu ngoặc và dấu ngoặc nhọn.

Với điều này, phần sau sẽ giải quyết vấn đề của bạn theo cách tuân thủ PEP-8.

return (
    f'{self.date} - {self.time}\n'
    f'Tags: {self.tags}\n'
    f'Text: {self.text}'
)

Các chuỗi Python sẽ tự động nối khi không được phân tách bằng dấu phẩy, vì vậy bạn không cần phải gọi một cách rõ ràng join().


39

Tôi nghĩ nó sẽ là

return f'''{self.date} - {self.time},
Tags: {self.tags},
Text: {self.text}'''

bây giờ mà đóng của nó tôi có thể xóa câu trả lời này nếu mọi người nghĩ rằng tôi nên ... nhưng nó không được đề cập trong câu trả lời dupe: / \
Joran Beasley

8
nhưng loại này của nhiều dòng đánh bại mục đích của f-strings và thụt đầu dòng Ngoài ra tôi không cảm thấy như thế này là việc sử dụng đúng các dây quote ba, cảm thấy như một hack
Owlzy

2
Mặc dù câu trả lời này lặp lại ý định của OP, nhưng tôi cảm thấy câu trả lời của @ gật gù tốt hơn. Câu trả lời này chỉ xảy ra là đúng vì OP cũng muốn đa dòng ở đầu ra. Nếu bạn muốn đầu ra có bố cục khác với mã nguồn, thì dấu ngoặc kép không phải là cách để thực hiện.
Mike Williamson

10

Bạn có thể sử dụng ba dấu ngoặc kép đơn hoặc ba dấu ngoặc kép kép, nhưng hãy đặt một f ở đầu chuỗi:

Báo giá ba đơn

return f'''{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}'''

Báo giá gấp ba lần

return f"""{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}"""

Lưu ý rằng bạn không cần sử dụng "\ n" vì bạn đang sử dụng một chuỗi nhiều dòng.


7

Như đã đề cập bởi @noddy, phương pháp này cũng hoạt động đối với biểu thức gán biến:

var1 = "foo"
var2 = "bar"
concat_var = (f"First var is: {var1}"
              f" and in same line Second var is: {var2}")
print(concat_var)

nên cung cấp cho bạn:

First var is: foo and in same line Second var is: bar
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.