Hướng dẫn python remove tabs from multiline string - python xóa các tab khỏi chuỗi nhiều dòng

Các thụt lề thích hợp cho các chuỗi đa dòng Python trong một chức năng là gì?

    def method[]:
        string = """line one
line two
line three"""

hoặc

    def method[]:
        string = """line one
        line two
        line three"""

hoặc cái gì khác?

Có vẻ kỳ lạ khi có chuỗi treo bên ngoài chức năng trong ví dụ đầu tiên.

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges

Đã hỏi ngày 23 tháng 3 năm 2010 lúc 23:35Mar 23, 2010 at 23:35

2

Bạn có thể muốn xếp hàng với

def foo[]:
    string = """line one
             line two
             line three"""
1

def foo[]:
    string = """line one
             line two
             line three"""

Vì các đường mới và không gian được bao gồm trong chính chuỗi, bạn sẽ phải xử lý nó. Nếu bạn không muốn làm điều đó và bạn có rất nhiều văn bản, bạn có thể muốn lưu trữ riêng trong tệp văn bản. Nếu một tệp văn bản không hoạt động tốt cho ứng dụng của bạn và bạn không muốn hậu xử lý, có lẽ tôi sẽ đi với

def foo[]:
    string = ["this is an "
              "implicitly joined "
              "string"]

Nếu bạn muốn xử lý một chuỗi đa dòng để cắt ra các bộ phận bạn không cần, bạn nên xem xét mô -đun

def foo[]:
    string = """line one
             line two
             line three"""
2 hoặc kỹ thuật cho các tài liệu sau xử lý được trình bày trong PEP 257:

def trim[docstring]:
    if not docstring:
        return ''
    # Convert tabs to spaces [following the normal Python rules]
    # and split into a list of lines:
    lines = docstring.expandtabs[].splitlines[]
    # Determine minimum indentation [first line doesn't count]:
    indent = sys.maxint
    for line in lines[1:]:
        stripped = line.lstrip[]
        if stripped:
            indent = min[indent, len[line] - len[stripped]]
    # Remove indentation [first line is special]:
    trimmed = [lines[0].strip[]]
    if indent < sys.maxint:
        for line in lines[1:]:
            trimmed.append[line[indent:].rstrip[]]
    # Strip off trailing and leading blank lines:
    while trimmed and not trimmed[-1]:
        trimmed.pop[]
    while trimmed and not trimmed[0]:
        trimmed.pop[0]
    # Return a single string:
    return '\n'.join[trimmed]

Đã trả lời ngày 23 tháng 3 năm 2010 lúc 23:46Mar 23, 2010 at 23:46

Mike Grahammike GrahamMike Graham

71.6K14 Huy hiệu vàng98 Huy hiệu bạc129 Huy hiệu đồng14 gold badges98 silver badges129 bronze badges

15

Hàm

def foo[]:
    string = """line one
             line two
             line three"""
3 cho phép người ta bắt đầu với vết lõm chính xác trong nguồn, sau đó tước nó khỏi văn bản trước khi sử dụng.correct indentation in the source, and then strip it from the text before use.

Sự đánh đổi, như đã lưu ý bởi một số người khác, là đây là một lời kêu gọi chức năng bổ sung trên nghĩa đen; Hãy tính đến điều này khi quyết định nơi đặt các nghĩa đen này vào mã của bạn.

import textwrap

def frobnicate[param]:
    """ Frobnicate the scrognate param.

        The Weebly-Ruckford algorithm is employed to frobnicate
        the scrognate to within an inch of its life.

        """
    prepare_the_comfy_chair[param]
    log_message = textwrap.dedent["""\
            Prepare to frobnicate:
            Here it comes...
                Any moment now.
            And: Frobnicate!"""]
    weebly[param, log_message]
    ruckford[param]

Trailing

def foo[]:
    string = """line one
             line two
             line three"""
4 trong thông điệp nhật ký theo nghĩa đen là để đảm bảo rằng việc phá vỡ dòng không theo nghĩa đen; Bằng cách đó, chữ không bắt đầu với một dòng trống, và thay vào đó bắt đầu với dòng đầy đủ tiếp theo.

Giá trị trả về từ

def foo[]:
    string = """line one
             line two
             line three"""
3 là chuỗi đầu vào với tất cả các vết lõm khoảng trắng hàng đầu phổ biến được xóa trên mỗi dòng của chuỗi. Vì vậy, giá trị
def foo[]:
    string = """line one
             line two
             line three"""
6 ở trên sẽ là:all common leading whitespace indentation removed on each line of the string. So the above
def foo[]:
    string = """line one
             line two
             line three"""
6 value will be:

Prepare to frobnicate:
Here it comes...
    Any moment now.
And: Frobnicate!

Đã trả lời ngày 23 tháng 3 năm 2010 lúc 23:45Mar 23, 2010 at 23:45

Bignosebignosebignose

28.8K14 Huy hiệu vàng73 Huy hiệu bạc108 Huy hiệu đồng14 gold badges73 silver badges108 bronze badges

5

Sử dụng

def foo[]:
    string = """line one
             line two
             line three"""
7 như vậy:

import inspect

def method[]:
    string = inspect.cleandoc["""
        line one
        line two
        line three"""]

Thắng tương đối sẽ được duy trì như mong đợi. Như đã nhận xét dưới đây, nếu bạn muốn tiếp tục trước các dòng trống, hãy sử dụng

def foo[]:
    string = """line one
             line two
             line three"""
3. Tuy nhiên, điều đó cũng giữ cho dòng đầu tiên.

Lưu ý: Đó là cách thực hành tốt để thụt các khối mã logic trong bối cảnh liên quan của nó để làm rõ cấu trúc. Ví dụ. Chuỗi đa dòng thuộc biến

def foo[]:
    string = """line one
             line two
             line three"""
9. It's good practice to indent logical blocks of code under its related context to clarify the structure. E.g. the multi-line string belonging to the variable
def foo[]:
    string = """line one
             line two
             line three"""
9.

Đã trả lời ngày 5 tháng 1 năm 2018 lúc 11:40Jan 5, 2018 at 11:40

Wihlkewihlkewihlke

2.1561 Huy hiệu vàng17 Huy hiệu bạc15 Huy hiệu đồng1 gold badge17 silver badges15 bronze badges

2

Một tùy chọn dường như bị thiếu trong các câu trả lời khác [chỉ được đề cập sâu thẳm trong nhận xét của NAXA] là như sau:

def foo[]:
    string = ["line one\n"          # Add \n in the string
              "line two"  "\n"      # Add "\n" after the string
              "line three\n"]

Điều này sẽ cho phép căn chỉnh thích hợp, tham gia các dòng một cách ngầm và vẫn giữ sự thay đổi dòng, đối với tôi, là một trong những lý do tại sao tôi muốn sử dụng các chuỗi đa dòng.

Nó không yêu cầu bất kỳ quá trình hậu xử lý nào, nhưng bạn cần thêm thủ công

def foo[]:
    string = ["this is an "
              "implicitly joined "
              "string"]
0 tại bất kỳ nơi nào mà bạn muốn dòng kết thúc. Hoặc là một chuỗi riêng biệt sau. Cái sau dễ dàng hơn để sao chép-dán vào.

Đã trả lời ngày 3 tháng 10 năm 2015 lúc 18:41Oct 3, 2015 at 18:41

Holroyholroyholroy

2.91521 Huy hiệu bạc37 Huy hiệu đồng21 silver badges37 bronze badges

3

Một số lựa chọn khác. Trong ipython với pylab được bật, DEDENT đã ở trong không gian tên. Tôi đã kiểm tra và đó là từ matplotlib. Hoặc nó có thể được nhập với:

from matplotlib.cbook import dedent

Trong tài liệu, nó nói rằng nó nhanh hơn so với văn bản tương đương và trong các thử nghiệm của tôi trong ipython, trung bình thực sự nhanh hơn gấp 3 lần với các bài kiểm tra nhanh của tôi. Nó cũng có lợi ích là nó loại bỏ bất kỳ dòng trống hàng đầu nào Điều này cho phép bạn linh hoạt trong cách bạn xây dựng chuỗi:

    def method[]:
        string = """line one
        line two
        line three"""
0

Sử dụng matplotlib dành cho ba ví dụ này sẽ cho kết quả hợp lý tương tự. Chức năng DEDENT TextWrap sẽ có một dòng trống hàng đầu với ví dụ thứ nhất.

Nhược điểm rõ ràng là TextWrap nằm trong thư viện tiêu chuẩn trong khi matplotlib là mô -đun bên ngoài.

Một số sự đánh đổi ở đây ... các chức năng dành cho mã của bạn dễ đọc hơn khi các chuỗi được xác định, nhưng yêu cầu xử lý sau đó để có được chuỗi ở định dạng có thể sử dụng. Trong DocStrings, rõ ràng là bạn nên sử dụng thụt chính xác vì hầu hết các cách sử dụng của DocString sẽ thực hiện xử lý cần thiết.

Khi tôi cần một chuỗi không dài trong mã của mình, tôi tìm thấy mã xấu xí sau đây, nơi tôi để chuỗi dài thả ra khỏi vết lõm kèm theo. Chắc chắn thất bại trong "Đẹp là tốt hơn xấu.", Nhưng người ta có thể lập luận rằng nó đơn giản và rõ ràng hơn so với sự thay thế dành cho sự thay thế.

    def method[]:
        string = """line one
        line two
        line three"""
1

Đã trả lời ngày 30 tháng 5 năm 2013 lúc 6:56May 30, 2013 at 6:56

JoopjoopJoop

7.4627 Huy hiệu vàng40 Huy hiệu bạc57 Huy hiệu đồng7 gold badges40 silver badges57 bronze badges

Nếu bạn muốn có một giải pháp nhanh chóng và dễ dàng và tự cứu mình khỏi việc gõ Newlines, bạn có thể chọn danh sách thay thế, ví dụ::

    def method[]:
        string = """line one
        line two
        line three"""
2

Đã trả lời ngày 25 tháng 11 năm 2015 lúc 18:36Nov 25, 2015 at 18:36

Steobertsebertsteabert

6.3012 Huy hiệu vàng26 Huy hiệu bạc31 Huy hiệu Đồng2 gold badges26 silver badges31 bronze badges

1

tôi thích

    def method[]:
        string = """line one
        line two
        line three"""
3

hoặc

    def method[]:
        string = """line one
        line two
        line three"""
4

Đã trả lời ngày 9 tháng 3 năm 2016 lúc 7:57Mar 9, 2016 at 7:57

lk_vclk_vclk_vc

1.08820 Huy hiệu bạc26 Huy hiệu đồng20 silver badges26 bronze badges

4

Hai xu của tôi, thoát khỏi cuối dòng để có được các vết thương:

    def method[]:
        string = """line one
        line two
        line three"""
5

Đã trả lời ngày 10 tháng 4 năm 2016 lúc 17:36Apr 10, 2016 at 17:36

SimonsimonSimon

4566 Huy hiệu bạc11 Huy hiệu đồng6 silver badges11 bronze badges

Tôi đến đây để tìm kiếm một lớp 1 đơn giản để xóa/sửa mức nhận dạng của tài liệu để in, mà không làm cho nó trông không gọn gàng, ví dụ bằng cách làm cho nó "treo bên ngoài hàm" trong tập lệnh.remove/correct the identation level of the docstring for printing, without making it look untidy, for example by making it "hang outside the function" within the script.

Đây là những gì tôi đã kết thúc làm:

    def method[]:
        string = """line one
        line two
        line three"""
6

Rõ ràng, nếu bạn đang thụt vào khoảng trống [ví dụ: 4] thay vì khóa tab sử dụng một cái gì đó như thế này: thay vào đó:

    def method[]:
        string = """line one
        line two
        line three"""
7

Và bạn không cần phải xóa nhân vật đầu tiên nếu bạn thích tài liệu của mình trông như thế này: thay vào đó:

    def method[]:
        string = """line one
        line two
        line three"""
8

Đã trả lời ngày 29 tháng 3 năm 2012 lúc 18:53Mar 29, 2012 at 18:53

1

Đối với các chuỗi, bạn có thể chỉ sau khi xử lý chuỗi. Đối với các tài liệu, bạn cần phải sau khi xử lý chức năng thay thế. Đây là một giải pháp cho cả hai vẫn có thể đọc được.

    def method[]:
        string = """line one
        line two
        line three"""
9

Đã trả lời ngày 2 tháng 6 năm 2017 lúc 2:05Jun 2, 2017 at 2:05

Geckosgeckosgeckos

5.2231 Huy hiệu vàng39 Huy hiệu bạc44 Huy hiệu đồng1 gold badge39 silver badges44 bronze badges

1

Tùy chọn đầu tiên là cái tốt - với thụt lề bao gồm. Đó là theo phong cách Python - cung cấp khả năng đọc cho mã.

Để hiển thị nó đúng cách:

def foo[]:
    string = """line one
             line two
             line three"""
0

Đã trả lời ngày 8 tháng 3 năm 2018 lúc 8:49Mar 8, 2018 at 8:49

2

Nó phụ thuộc vào cách bạn muốn văn bản hiển thị. Nếu bạn muốn tất cả được liên kết bên trái thì hoặc định dạng nó như trong đoạn trích đầu tiên hoặc lặp qua các dòng cắt bỏ bên trái tất cả không gian.

Đã trả lời ngày 23 tháng 3 năm 2010 lúc 23:39Mar 23, 2010 at 23:39

1

Chủ Đề