Chuỗi nhiều dòng Python không có thụt lề

Bạn đang viết một số Python và bạn cần viết ra một chuỗi chứa các dòng mới. Bạn có hai lựa chọn. một chuỗi thông thường có

def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
1 trong đó hoặc một chuỗi ký tự nhiều dòng sử dụng ba dấu ngoặc kép [những dấu ngoặc kép đó có phải là dấu ngoặc kép không?], trông như thế này

my_string = """This
is a
multi-line string"""
assert my_string == "This\nis a\nmulti-line string"

Nhưng bạn có một vấn đề. Điểm trong mã của bạn nơi bạn đặt chuỗi được thụt lề và những khoảng thụt lề đó hiển thị trong chuỗi của bạn, như thế này

def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"

Có một chức năng tiện dụng trong thư viện tiêu chuẩn cho cái này được gọi là

def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
2. Nó loại bỏ khoảng trắng hàng đầu phổ biến khỏi các dòng trong đầu vào. Vì vậy, bạn đặt nó xung quanh chuỗi của mình, nhưng nó không giúp được gì

def get_string[]:
return textwrap.dedent["""This
is a
multi-line string"""]
assert get_string[] == "This\n is a\n multi-line string"

Bạn có thể nhận thấy rằng dòng đầu tiên,

def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
3 không có khoảng trắng ở đầu. Bạn có thể thêm khoảng trắng ở đầu theo cách thủ công, nhưng có một cách tốt hơn. nếu dòng đầu tiên của chuỗi thực sự nằm trên dòng tiếp theo [thụt lề] thì sao?

Tôi hiếm khi thấy các chuỗi Nhiều dòng được sử dụng trong mã Python bên ngoài các chuỗi tài liệu, nhưng chúng có thể rất hữu ích, đặc biệt khi bạn cần tạo một chuỗi có cấu trúc rất cụ thể, chẳng hạn như đoạn mã, phần trợ giúp để in ra màn hình hoặc nghệ thuật ASCII cho một con rắn. Vấn đề là nó rất xấu, bởi vì thụt đầu dòng thực sự chèn thụt đầu dòng vào chuỗi. Vì vậy, bạn phải làm điều này

def create_snippet[]:
    code_snippet = """\
int main[int argc, char* argv[]] {
    return 0;
}"""
    do_something[code_snippet]

Đây chỉ là Python không thể đọc được, không thể đọc được. Khi làm việc trên pydocstyle, tôi phải kiểm tra trình phân tích cú pháp mã Python. Tôi muốn tìm cách cung cấp cho nó một đoạn mã nguồn Python nhỏ trong mỗi bài kiểm tra. Sau khi mày mò, tôi đã tìm thấy một thành ngữ thực sự tiện dụng giúp làm cho các chuỗi nhiều dòng trong Python trông đẹp mắt

def create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]

Nước sốt bí mật cho điều này là

def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
4. Mô-đun
def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
5 nằm trong thư viện tiêu chuẩn, vì vậy thực sự không có lý do gì để không sử dụng nó. Những gì nó làm là nó "xóa mọi khoảng trắng hàng đầu phổ biến khỏi mọi dòng trong
def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
6". Với
def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
7, chúng ta có thể thụt lề toàn bộ chuỗi nhiều dòng theo phạm vi hiện tại, để nó trông giống như một khối mã Pythonic

Để hiểu cách hoạt động của dedent, đây là đoạn trích tương tự như trên, với các khoảng trắng được đánh dấu cho chuỗi nhiều dòng. Khoảng trắng

def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
8 sẽ bị xóa và khoảng trắng
def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
9 sẽ không

def create_snippet[]:
    code_snippet = textwrap.dedent["""\
--------int main[int argc, char* argv[]] {
--------++++return 0;
--------}
    """]  # This line is only whitespace, so `dedent` ignores it.
    do_something[code_snippet]

Dòng đầu tiên có thể gây rắc rối cho chúng ta ở đây, bởi vì mặc dù nó sẽ không gây rắc rối với việc thụt đầu dòng, nhưng nó sẽ chèn một dòng mới vào đầu chuỗi của chúng ta. Vì vậy, chúng tôi sử dụng dấu gạch chéo ngược-ngắt dòng ngay sau khi mở chuỗi, điều này cho phép chúng tôi thực hiện ngắt dòng trong mã nguồn, nhưng không phải trong chính chuỗi đó. Sau đó, dòng đầu tiên cũng được thụt vào, điều này cho phép

def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
7 thực hiện phần việc nặng nhọc còn lại. Tôi muốn thụt lề chuỗi nhiều dòng xa hơn phạm vi hiện tại một đoạn để biến nó thành một khối riêng biệt

Tôi đang tìm hiểu cách in các chuỗi nhiều dòng, phù hợp, ví dụ như một thông báo cho người dùng chương trình

Vấn đề tôi gặp phải liên quan đến thụt đầu dòng; . Nếu một người muốn tiếp tục chuỗi đã in trên các dòng tiếp theo trong. py, tất cả các dòng sau dòng đầu tiên phải được căn lề trái [i. e không thụt lề] vì bất kỳ sự thụt lề nào cũng sẽ được in ra cho người dùng. Hãy xem xét ví dụ sau…

if True:
    print['The Owl and the Pussy-Cat went to sea in a beautiful pea green boat\n\
    they took some honey and plenty of money wrapped up in a five pound note']

Kết quả sẽ là một dòng thứ hai được thụt vào bốn vị trí sau dòng đầu tiên trong đầu ra của chương trình. Docstrings thể hiện cùng một hành vi…

if True:
    print['''The Owl and the Pussy-Cat went to sea in a beautiful pea green boat\n
    they took some honey and plenty of money wrapped up in a five pound note''']

Giải pháp duy nhất tôi nghĩ ra cho đến nay là không thụt lề bất kỳ dòng nào sau dòng đầu tiên…

________số 8

Hoặc để thay thế tất cả các trường hợp có bốn ký tự khoảng trắng liên tiếp bằng một chuỗi trống…

if True:
    print['The owl and the Pussy-Cat went to sea in a beautiful pea green boat\n\
    they took some honey and plenty of money wrapped up in a five pound note'.replace['    ', '']]

Trong BASH có một ký hiệu có thể được sử dụng để viết ở đây-các tài liệu chứa các tab mà trình bao sẽ bỏ qua…

def get_string[]:
return """This
is a
multi-line string"""
assert get_string[] == "This\n is a\n multi-line string"
0

Tôi đang tìm kiếm một cái gì đó giống như ở trên, nhưng nếu có cách nào phù hợp hơn hoặc 'trăn' hơn để làm điều đó thì vui lòng cho tôi biết

Chủ Đề