Hướng dẫn what do you do when a line is too long in python? - bạn làm gì khi một dòng quá dài trong python?

Từ PEP 8 - Hướng dẫn kiểu cho mã Python:

Cách ưa thích để gói các đường dài là bằng cách sử dụng tiếp tục dòng ngụ ý của Python bên trong ngoặc đơn, ngoặc và thanh giằng. Các đường dài có thể được phá vỡ trên nhiều dòng bằng cách gói các biểu thức trong ngoặc đơn. Chúng nên được sử dụng theo sở thích để sử dụng dấu gạch chéo ngược để tiếp tục dòng. Long lines can be broken over multiple lines by wrapping expressions in parentheses. These should be used in preference to using a backslash for line continuation.

Backslashes vẫn có thể phù hợp đôi khi. Ví dụ, dài, nhiều người không thể sử dụng tiếp tục ngầm, do đó, các dấu gạch chéo ngược có thể chấp nhận được:

with open('/path/to/some/file/you/want/to/read') as file_1, \
     open('/path/to/some/file/being/written', 'w') as file_2:
     file_2.write(file_1.read())

Một trường hợp như vậy là với các tuyên bố khẳng định.

Hãy chắc chắn để thụt dòng dòng tiếp tục một cách thích hợp. Nơi ưa thích để phá vỡ một toán tử nhị phân là sau người vận hành, không phải trước nó. Vài ví dụ:after the operator, not before it. Some examples:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())

PEP8 hiện khuyến nghị quy ước ngược lại (để phá vỡ các hoạt động nhị phân) được sử dụng bởi các nhà toán học và các nhà xuất bản của họ để cải thiện khả năng đọc.

Phong cách phá vỡ của Donald Knuth trước một toán tử nhị phân sắp xếp các toán tử theo chiều dọc, do đó làm giảm khối lượng công việc của mắt khi xác định các mục nào được thêm và trừ.before a binary operator aligns operators vertically, thus reducing the eye's workload when determining which items are added and subtracted.

Từ PEP8: nên phá vỡ dòng trước hay sau khi vận hành nhị phân?:

Donald Knuth giải thích quy tắc truyền thống trong các máy tính và loạt sắp chữ của mình: "Mặc dù các công thức trong một đoạn văn luôn bị phá vỡ sau khi hoạt động và quan hệ nhị phân, các công thức hiển thị luôn bị phá vỡ trước khi hoạt động nhị phân" [3].

Theo truyền thống từ toán học thường dẫn đến mã dễ đọc hơn:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Trong mã Python, được phép phá vỡ trước hoặc sau một toán tử nhị phân, miễn là quy ước là nhất quán tại địa phương. Đối với phong cách mới của mã Knuth được đề xuất.

[3]: The Texbook của Donald Knuth, trang 195 và 196

Đăng nhập vào tài khoản Python Barsels của bạn để lưu cài đặt screencast của bạn.

Vẫn chưa có tài khoản? Đăng ký tại đây.

Hãy nói về việc phá vỡ các dòng mã dài trong Python.

Cách tiếp tục mã trên dòng tiếp theo

Câu lệnh nhập dưới đây dài hơn tôi muốn cho một dòng liên tục duy nhất:

from collections.abc import Hashable, Iterable, KeysView, Mapping, MutableMapping, Set

Lưu ý từ Trey: Tôi thường sử dụng chiều dài dòng tối đa 79 ký tự trong các dự án của mình (mặc dù điều này thực sự thay đổi từ dự án này sang dự án khác).

Chúng ta có thể chia dòng này thành hai bằng cách đặt dấu gạch chéo ngược (

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
7) ở cuối dòng và sau đó nhấn phím
class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
8:

from collections.abc import Hashable, Iterable, KeysView, Mapping, \
        MutableMapping, Set

Đây là một cách để nói với Python rằng dòng mã đầu tiên tiếp tục vào dòng tiếp theo. Điều này hoạt động trong Python nhưng nó không được khuyến khích.it's not recommended.

Thay vào đó, Hướng dẫn kiểu Python (PEP 8) khuyến nghị sử dụng tiếp tục dòng ẩn. Việc tiếp tục dòng ngầm xảy ra bất cứ khi nào Python đi đến cuối dòng mã và thấy rằng có nhiều thứ sẽ đến vì dấu ngoặc đơn (

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
9), khung vuông (
# Yes: easy to match operators with operands
0) hoặc nẹp xoăn (
# Yes: easy to match operators with operands
1) đã được mở.implicit line continuation happens whenever Python gets to the end of a line of code and sees that there's more to come because a parenthesis (
class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
9), square bracket (
# Yes: easy to match operators with operands
0) or curly brace (
# Yes: easy to match operators with operands
1) has been left open.

Vì vậy, việc thêm dấu ngoặc đơn (

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
9 và
# Yes: easy to match operators with operands
3) vào dòng này sẽ cho phép chúng tôi đặt Newlines bất cứ nơi nào chúng tôi muốn bên trong các dấu ngoặc đơn đó:

from collections.abc import (
    Hashable,Iterable, KeysView, Mapping,
        MutableMapping, Set)

Căn chỉnh là một sở thích cá nhân

Khi gói mã trên nhiều dòng, một số lập trình viên Python thích xếp hàng mã của họ một cách trực quan như thế này:

from collections.abc import (Hashable, Iterable, KeysView, Mapping,
                             MutableMapping, Set)

Nhưng một số lập trình viên Python thay vào đó đặt từng mục trên dòng riêng của mình:

from collections.abc import (
    Hashable,
    Iterable,
    KeysView,
    Mapping,
    MutableMapping,
    Set,
)

Tuy nhiên, bạn chọn phá vỡ các dòng của mình, hãy biết rằng trong ngoặc đơn, bạn có thể đặt các lần ngắt dòng bất cứ nơi nào bạn muốn vào mã của mình và bạn có thể đặt bất kỳ khoảng trắng nào bạn muốn bên trong dấu ngoặc đơn:

from collections.abc import (Hashable,
    Iterable, KeysView, Mapping,
                             MutableMapping, Set)

Khoảng cách kỳ lạ ở trên hoạt động vì đây không phải là thụt lề, đó là sự liên kết. Python đối xử với không gian trắng trong các dấu ngoặc đơn đó giống như nó sẽ đối xử với khoảng trắng ở giữa bất kỳ dòng mã nào khác.this isn't indentation, it's alignment. Python treats white space within those parentheses as the same as it would treat whitespace in the middle of any other line of code.

Đó là vấn đề sở thích cá nhân về cách bạn kết thúc mã của mình. Bạn có thể nhìn vào PEP 8 cho một số ý tưởng.

Các cuộc gọi chức năng đã có dấu ngoặc đơn

Điều gì sẽ xảy ra nếu bạn muốn kết thúc một cuộc gọi chức năng qua nhiều dòng?

Bên trong một cuộc gọi chức năng (như

# Yes: easy to match operators with operands
4 bên dưới) chúng tôi đã có dấu ngoặc đơn:we already have parentheses:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
0

Chúng ta không cần thêm dấu ngoặc đơn. Chúng tôi có thể thêm các lần phá vỡ dòng bất cứ nơi nào chúng tôi muốn trong một cuộc gọi chức năng và nó khá chỉ hoạt động:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
1

Tiếp tục dòng ẩn hoạt động cho tất cả các loại dấu ngoặc và niềng răng

Quy tắc tương tự áp dụng cho dấu ngoặc vuông (

# Yes: easy to match operators with operands
5).

Nếu chúng ta muốn chia nhỏ danh sách dài trên nhiều dòng:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
2

Chúng tôi có thể thêm các lần phá vỡ dòng bất cứ nơi nào chúng tôi muốn trong danh sách đó:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
3

Miễn là chúng ta có một khung vuông mở (

# Yes: easy to match operators with operands
0), dấu ngoặc đơn (
class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
9) hoặc một nẹp xoăn mở (
# Yes: easy to match operators with operands
1), chúng ta có thể thêm các đường ngắt bất cứ nơi nào chúng ta muốn trong các dấu ngoặc hoặc niềng răng đó.

Điều đó có nghĩa là chúng ta có thể lấy từ điển này:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
4

Và phá vỡ nó trên nhiều dòng bằng cách đặt các đường tắt sau mỗi phần tử:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
5

Mã số tự động có thể giúp

Bạn không cần phải làm điều này một mình. Bạn có thể chọn sử dụng một định dạng mã, như màu đen, để thực hiện công việc này cho bạn:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())
6

Tuy nhiên, bạn chọn phá vỡ mã của mình trên nhiều dòng, hãy nhớ rằng đó là tất cả về dấu ngoặc (

# Yes: easy to match operators with operands
5) và niềng răng (
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)
0 và
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)
1): Đó là những gì cho phép tiếp tục dòng ẩn.

Bản tóm tắt

Nếu bạn có một dòng mã rất dài trong Python và bạn muốn chia nó qua nhiều dòng, nếu bạn ở bên trong dấu ngoặc đơn, giá đỡ vuông hoặc niềng răng xoăn, bạn có thể đặt các đường ngắt bất cứ nơi nào bạn muốn vì Python Cho phép tiếp tục dòng ẩn.you're inside parentheses, square brackets, or curly braces you can put line breaks wherever you'd like because Python allows for implicit line continuation.

Nếu bạn chưa có dấu ngoặc hoặc niềng răng trên dòng của mình, bạn có thể thêm dấu ngoặc đơn ở bất cứ nơi nào bạn muốn và sau đó đặt các đường vỡ trong chúng để định dạng mã của bạn trên nhiều dòng.add parentheses wherever you'd like and then put line breaks within them to format your code nicely over multiple lines.

Làm cách nào để sửa dòng quá dài trong Python?

Sử dụng tiếp tục dòng được suy ra của Python trong ngoặc đơn, dấu ngoặc và niềng răng là phương pháp được đề xuất để bọc các dòng dài.Bạn có thể đặt thêm một cặp dấu ngoặc đơn xung quanh một biểu thức nếu được yêu cầu.Chúng ta phải áp dụng các điểm dừng đường ngoặc này vào các dòng dài mà chúng ta muốn kết thúc. is the recommended method of wrapping lengthy lines. You can put an extra pair of parentheses around an expression if required. We have to apply these parenthesized line breaks to the long lines that we would want to wrap.

Làm thế nào để bạn cắt một hàng dài trong Python?

Bạn không thể chia một câu lệnh thành nhiều dòng trong Python bằng cách nhấn Enter.Thay vào đó, hãy sử dụng dấu gạch chéo ngược (\) để chỉ ra rằng một câu lệnh được tiếp tục trên dòng tiếp theo.use the backslash ( \ ) to indicate that a statement is continued on the next line.

Làm thế nào để bạn xử lý một chuỗi dài trong Python?

Sử dụng dấu ngoặc đơn trong Python, bạn có thể tự do phá vỡ dòng trong ngoặc đơn ((), {}, []).Sử dụng quy tắc này, bạn có thể viết một chuỗi dài trên nhiều dòng với dấu ngoặc đơn thay vì dấu gạch chéo ngược. In Python, you can freely break the line in parentheses ( () , {} , [] ). Using this rule, you can write a long string on multiple lines with parentheses instead of backslashes.

Làm thế nào để bạn phá vỡ một dòng mã dài?

Sử dụng ký tự liên tục dòng, là một dấu gạch dưới (_), tại điểm mà bạn muốn dòng bị phá vỡ..