Thụt lề chuỗi nhiều dòng trong Python

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ó chứa

def create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]
1 trong đó hoặc một chuỗi ký tự nhiều dòng sử dụng ba dấu ngoặc kép [đó có phải là các 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 create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]
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 create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]
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 create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]
4. Mô-đun
def create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]
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 create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]
6". Với
def create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]
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. ________ 48 khoảng trắng sẽ bị xóa và ________ 49 khoảng trắng 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ố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 create_snippet[]:
    code_snippet = textwrap.dedent["""\
        int main[int argc, char* argv[]] {
            return 0;
        }
    """]
    do_something[code_snippet]
7 thực hiện phần còn lại của công việc nặng nhọc. 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

Hãy nói về cách tạo một chuỗi nhiều dòng trong Python mà không vô tình thụt lề văn bản trong chuỗi đó

Xóa chuỗi nhiều dòng theo cách thủ công

Ở đây chúng tôi có một chức năng in ra tuyên bố bản quyền

def copyright[]:
    print["""\
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved."""
    ]

Chức năng này hoạt động, nhưng tuyên bố bản quyền mà nó in ra bị thụt vào

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.

Mỗi dòng trong tuyên bố bản quyền này bắt đầu bằng tám khoảng trắng. Điều này xảy ra bởi vì trong mã của chúng tôi, văn bản trong chuỗi của chúng tôi bắt đầu bằng tám khoảng trắng trước mỗi dòng

Chúng tôi có thể khắc phục sự cố này bằng cách xóa thủ công văn bản trong chuỗi này

________số 8

Trong khi điều này không làm việc

>>> copyright[]
Copyright [c] 1991-2000 ACME Corp
All Rights Reserved.

Copyright [c] 2000-2030 Cyberdyne
All Rights Reserved.

Điều này cũng làm cho mã của chúng tôi hơi khó đọc

Mã của chúng tôi khó đọc hơn trước vì ở đây, mã của chúng tôi đột nhiên bị lõm ở giữa chuỗi của chúng tôi

Chúng tôi có thể khắc phục sự cố này bằng cách sử dụng hàm

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 trong mô-đun
>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
4 của Python

Sử dụng
>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
5 để bỏ thụt lề chuỗi

Hàm

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 cho phép chúng tôi thụt lề mã theo bất kỳ cách nào chúng tôi muốn

Chuỗi nhiều dòng của chúng tôi có thể được thụt lề độc đáo trong mã của chúng tôi vì hàm

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 sẽ làm mất nó cho chúng tôi

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

Tại thời điểm chúng ta sử dụng chuỗi này, chúng ta sẽ thấy rằng nó không có bất kỳ vết lõm nào

>>> copyright[]
Copyright [c] 1991-2000 ACME Corp
All Rights Reserved.

Copyright [c] 2000-2030 Cyberdyne
All Rights Reserved.

Hàm

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 đã xóa thụt đầu dòng cho chúng tôi

Tâm trí dòng mới của bạn

Lưu ý rằng chuỗi của chúng tôi bắt đầu bằng dấu gạch chéo ngược [

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
9]

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

Dấu gạch chéo ngược đó sẽ loại bỏ ký tự dòng mới bổ sung [

def copyright[]:
    print["""\
Copyright [c] 1991-2000 ACME Corp
All Rights Reserved.

Copyright [c] 2000-2030 Cyberdyne
All Rights Reserved."""
    ]
0] mà chuỗi này sẽ bắt đầu bằng nếu dấu gạch chéo ngược này không có ở đây. Nếu không có dấu gạch chéo ngược đó, chúng ta sẽ cần bắt đầu văn bản của mình trên cùng một dòng để tránh ký tự xuống dòng đó

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

Lưu ý rằng chúng tôi cũng đang kết thúc chuỗi nhiều dòng của mình trên cùng một dòng mà văn bản của chúng tôi kết thúc

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

Thay vào đó, sẽ thật tuyệt nếu chúng ta có thể kết thúc nó ở dòng tiếp theo, nhưng điều đó sẽ thêm một dòng mới vào cuối chuỗi của chúng ta

Tôi thích kết hợp

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 với phương pháp chuỗi
def copyright[]:
    print["""\
Copyright [c] 1991-2000 ACME Corp
All Rights Reserved.

Copyright [c] 2000-2030 Cyberdyne
All Rights Reserved."""
    ]
2 để xử lý các dòng mới này

Kết hợp
>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 với
def copyright[]:
    print["""\
Copyright [c] 1991-2000 ACME Corp
All Rights Reserved.

Copyright [c] 2000-2030 Cyberdyne
All Rights Reserved."""
    ]
2 để làm cho mã dễ đọc hơn

Ở đây chúng tôi đang sử dụng phương pháp

def copyright[]:
    print["""\
Copyright [c] 1991-2000 ACME Corp
All Rights Reserved.

Copyright [c] 2000-2030 Cyberdyne
All Rights Reserved."""
    ]
2 với chuỗi của chúng tôi

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

Hàm

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 đang thụt lề một chuỗi bắt đầu bằng ký tự xuống dòng và kết thúc bằng ký tự xuống dòng [lưu ý rằng chúng ta kết thúc chuỗi nhiều dòng của mình ở dòng tiếp theo]. Sau khi chúng tôi dedent, sau đó chúng tôi sử dụng phương thức chuỗi
def copyright[]:
    print["""\
Copyright [c] 1991-2000 ACME Corp
All Rights Reserved.

Copyright [c] 2000-2030 Cyberdyne
All Rights Reserved."""
    ]
2 để xóa các ký tự xuống dòng đó

Tuyên bố bản quyền của chúng tôi có vẻ đúng như vậy

>>> copyright[]
Copyright [c] 1991-2000 ACME Corp
All Rights Reserved.

Copyright [c] 2000-2030 Cyberdyne
All Rights Reserved.

Và chúng tôi có mã thụt vào độc đáo không có dấu gạch chéo ngược lạ. Thêm vào đó, chúng ta không cần phải lo lắng về vị trí chính xác chuỗi nhiều dòng kết thúc trong mã của chúng ta. chúng tôi đang kết thúc chuỗi của mình trên dòng mới và điều đó không sao cả

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 duy trì mức thụt đầu dòng tương đối

Điều quan trọng cần lưu ý là hàm

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 không xóa tất cả khoảng trắng ở đầu mỗi dòng. Nó thông minh hơn một chút. Hàm
>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 duy trì thụt lề tương đối trong một chuỗi

Ở đây chúng tôi có một chuỗi dự kiến ​​​​sẽ có một số dòng thụt vào nhiều hơn những dòng khác

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
1

Bạn có thể thấy rằng mỗi dòng có ít nhất bốn khoảng cách thụt lề, nhưng một số dòng có nhiều khoảng cách thụt lề hơn

Khi chúng tôi chạy

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 đối với chuỗi này, bạn sẽ thấy bốn khoảng cách thụt đầu dòng [phổ biến cho mỗi dòng] bị xóa

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
2

Nhưng vết lõm mà một số dòng có [tương đối lớn hơn các dòng khác] được duy trì

Sử dụng
>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
5 để bỏ thụt lề chuỗi

Nếu bạn muốn định dạng độc đáo chuỗi nhiều dòng của mình trong mã Python mà không in nhầm văn bản thụt lề, bạn có thể sử dụng hàm

>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
3 từ mô-đun
>>> copyright[]
        Copyright [c] 1991-2000 ACME Corp
        All Rights Reserved.

        Copyright [c] 2000-2030 Cyberdyne
        All Rights Reserved.
4 của Python

Chủ Đề