Hướng dẫn python line length best practices - các phương pháp hay nhất về độ dài dòng python

Tôi là một lập trình viên phải đối phó với rất nhiều mã hàng ngày. Nguồn mở và những gì đã được phát triển trong nhà.

Là một lập trình viên, tôi thấy rất hữu ích khi mở nhiều tệp nguồn cùng một lúc và thường tổ chức máy tính để bàn của tôi trên màn hình (màn hình rộng) của tôi để hai tệp nguồn nằm cạnh nhau. Tôi có thể đang lập trình trong cả hai, hoặc chỉ đọc một và lập trình trong cái kia.

Tôi thấy nó không hài lòng và bực bội khi một trong những tệp nguồn đó có chiều rộng> 120 ký tự, bởi vì điều đó có nghĩa là tôi không thể thoải mái phù hợp với một dòng mã trên một dòng màn hình. Nó làm đảo lộn định dạng để bọc dòng.

Tôi nói '120' bởi vì đó là cấp độ mà tôi sẽ cảm thấy khó chịu khi mã rộng hơn. Sau nhiều ký tự, bạn nên chia tách trên các dòng để đọc, chứ đừng nói đến các tiêu chuẩn mã hóa.

Tôi viết mã với 80 cột trong tâm trí. Đây chỉ là khi tôi rò rỉ qua ranh giới đó, đó không phải là một điều xấu.

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: viết mã Pythonic đẹp với PEP 8 This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Writing Beautiful Pythonic Code With PEP 8

Các dòng Python nên kéo dài bao lâu?

Độ dài dòng tối đa và phá vỡ dòng PEP 8 gợi ý các dòng phải được giới hạn ở 79 ký tự. Điều này là do nó cho phép bạn mở nhiều tệp bên cạnh nhau, đồng thời tránh việc gói dòng. Tất nhiên, việc giữ tuyên bố cho 79 ký tự hoặc ít hơn không phải lúc nào cũng có thể.

Giới hạn độ dài được đề xuất cho một dòng mã là gì?

Đến cuối hướng dẫn này, bạn sẽ có thể::

  • Viết mã Python phù hợp với PEP 8
  • Hiểu lý do đằng sau các hướng dẫn được đưa ra trong PEP 8
  • Thiết lập môi trường phát triển của bạn để bạn có thể bắt đầu viết mã Python tuân thủ PEP 8

Tại sao chúng ta cần Pep 8

Khả năng đọc được số lượng.

- Zen of Python

PEP 8 tồn tại để cải thiện khả năng đọc của mã Python. Nhưng tại sao khả năng đọc lại quan trọng như vậy? Tại sao viết mã có thể đọc được là một trong những nguyên tắc hướng dẫn của ngôn ngữ Python?

Như Guido Van Rossum đã nói, mã Code được đọc thường xuyên hơn nhiều so với viết. Bạn có thể dành một vài phút, hoặc cả ngày, viết một đoạn mã để xử lý xác thực người dùng. Một khi bạn đã viết nó, bạn sẽ không bao giờ viết nó nữa. Nhưng bạn chắc chắn sẽ phải đọc nó một lần nữa. Món mã đó có thể vẫn là một phần của một dự án mà bạn đang làm việc. Mỗi khi bạn quay lại tệp đó, bạn sẽ phải nhớ mã đó làm gì và tại sao bạn viết nó, vì vậy khả năng đọc có vấn đề.

Nếu bạn mới sử dụng Python, có thể khó có thể nhớ một đoạn mã làm gì trong vài ngày, hoặc vài tuần, sau khi bạn viết nó. Nếu bạn theo PEP 8, bạn có thể chắc chắn rằng bạn đã đặt tên cho các biến của mình tốt. Bạn có thể biết rằng bạn đã thêm đủ khoảng trắng để nó dễ dàng hơn để làm theo các bước logic trong mã của bạn. Bạn cũng đã nhận xét mã của bạn tốt. Tất cả điều này sẽ có nghĩa là mã của bạn dễ đọc hơn và dễ dàng trở lại. Là người mới bắt đầu, tuân theo các quy tắc của PEP 8 có thể làm cho việc học Python trở thành một nhiệm vụ dễ chịu hơn nhiều.

Theo PEP 8 đặc biệt quan trọng nếu bạn đang tìm kiếm một công việc phát triển. Viết rõ ràng, mã có thể đọc được cho thấy sự chuyên nghiệp. Nó sẽ nói với một nhà tuyển dụng rằng bạn hiểu cách cấu trúc tốt mã của bạn.

Nếu bạn có thêm kinh nghiệm viết mã Python, thì bạn có thể cần phải hợp tác với người khác. Viết mã có thể đọc ở đây là rất quan trọng. Những người khác, những người có thể chưa bao giờ gặp bạn hoặc nhìn thấy phong cách mã hóa của bạn trước đây, sẽ phải đọc và hiểu mã của bạn. Có các hướng dẫn mà bạn làm theo và nhận ra sẽ giúp người khác đọc mã của bạn dễ dàng hơn.

Đặt tên quy ước

Rõ ràng là tốt hơn tiềm ẩn.

- Zen of Python

PEP 8 tồn tại để cải thiện khả năng đọc của mã Python. Nhưng tại sao khả năng đọc lại quan trọng như vậy? Tại sao viết mã có thể đọc được là một trong những nguyên tắc hướng dẫn của ngôn ngữ Python?

Như Guido Van Rossum đã nói, mã Code được đọc thường xuyên hơn nhiều so với viết. Bạn có thể dành một vài phút, hoặc cả ngày, viết một đoạn mã để xử lý xác thực người dùng. Một khi bạn đã viết nó, bạn sẽ không bao giờ viết nó nữa. Nhưng bạn chắc chắn sẽ phải đọc nó một lần nữa. Món mã đó có thể vẫn là một phần của một dự án mà bạn đang làm việc. Mỗi khi bạn quay lại tệp đó, bạn sẽ phải nhớ mã đó làm gì và tại sao bạn viết nó, vì vậy khả năng đọc có vấn đề.

Nếu bạn mới sử dụng Python, có thể khó có thể nhớ một đoạn mã làm gì trong vài ngày, hoặc vài tuần, sau khi bạn viết nó. Nếu bạn theo PEP 8, bạn có thể chắc chắn rằng bạn đã đặt tên cho các biến của mình tốt. Bạn có thể biết rằng bạn đã thêm đủ khoảng trắng để nó dễ dàng hơn để làm theo các bước logic trong mã của bạn. Bạn cũng đã nhận xét mã của bạn tốt. Tất cả điều này sẽ có nghĩa là mã của bạn dễ đọc hơn và dễ dàng trở lại. Là người mới bắt đầu, tuân theo các quy tắc của PEP 8 có thể làm cho việc học Python trở thành một nhiệm vụ dễ chịu hơn nhiều.

Theo PEP 8 đặc biệt quan trọng nếu bạn đang tìm kiếm một công việc phát triển. Viết rõ ràng, mã có thể đọc được cho thấy sự chuyên nghiệp. Nó sẽ nói với một nhà tuyển dụng rằng bạn hiểu cách cấu trúc tốt mã của bạn.Nếu bạn có thêm kinh nghiệm viết mã Python, thì bạn có thể cần phải hợp tác với người khác. Viết mã có thể đọc ở đây là rất quan trọng. Những người khác, những người có thể chưa bao giờ gặp bạn hoặc nhìn thấy phong cách mã hóa của bạn trước đây, sẽ phải đọc và hiểu mã của bạn. Có các hướng dẫn mà bạn làm theo và nhận ra sẽ giúp người khác đọc mã của bạn dễ dàng hơn.Đặt tên quy ước
Rõ ràng là tốt hơn tiềm ẩn.Khi bạn viết mã Python, bạn phải đặt tên cho rất nhiều thứ: biến, hàm, lớp, gói, v.v. Chọn tên hợp lý sẽ giúp bạn tiết kiệm thời gian và năng lượng sau này. Bạn có thể tìm ra, từ tên, một biến nhất định, chức năng hoặc lớp đại diện. Bạn cũng sẽ tránh sử dụng những cái tên không phù hợp có thể dẫn đến các lỗi khó gỡ lỗi.Đặt tên phong cách
Bảng dưới đây phác thảo một số kiểu đặt tên phổ biến trong mã Python và khi nào bạn nên sử dụng chúng:Loại hìnhQuy ước đặt tên
Ví dụHàm sốSử dụng một từ hoặc từ viết thường. Các từ riêng biệt bằng cách nhấn mạnh để cải thiện khả năng đọc.
class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
4,
class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
5
Biến đổiSử dụng một chữ cái chữ thường, từ hoặc từ. Các từ riêng biệt với dấu gạch dưới để cải thiện khả năng đọc.
class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
6,
class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
7,
class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
8
LớpBắt đầu mỗi từ với một chữ cái viết hoa. Không tách biệt các từ với dấu gạch dưới. Phong cách này được gọi là trường hợp lạc đà hoặc trường hợp pascal.
class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
9,
def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2
0
Phương phápSử dụng một từ hoặc từ viết thường. Các từ riêng biệt với dấu gạch dưới để cải thiện khả năng đọc.
def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2
1,
def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2
2
Không thay đổiSử dụng một chữ cái, từ hoặc từ chữ hoa. Các từ riêng biệt với dấu gạch dưới để cải thiện khả năng đọc.

def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2
3,
def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2
4,
def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2
5

Mô -đun

Sử dụng một từ hoặc từ ngắn, chữ thường. Các từ riêng biệt với dấu gạch dưới để cải thiện khả năng đọc.

def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2
6,
def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2
7

>>>

>>> # Not recommended
>>> x = 'John Smith'
>>> y, z = x.split()
>>> print(z, y, sep=', ')
'Smith, John'

Điều này sẽ hoạt động, nhưng bạn sẽ phải theo dõi những gì

class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
6,
def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
4 và
def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
5 đại diện. Nó cũng có thể gây nhầm lẫn cho các cộng tác viên. Một lựa chọn rõ ràng hơn nhiều về tên sẽ là một cái gì đó như thế này:

>>>

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'

Tương tự, để giảm số lượng gõ bạn làm, việc sử dụng chữ viết tắt khi chọn tên. Trong ví dụ dưới đây, tôi đã xác định một hàm

def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
6 có một đối số duy nhất
class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
6 và nhân đôi nó:

# Not recommended
def db(x):
    return x * 2

Thoạt nhìn, điều này có vẻ như là một lựa chọn hợp lý.

def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
6 có thể dễ dàng là một chữ viết tắt cho gấp đôi. Nhưng hãy tưởng tượng trở lại với mã này trong một vài ngày. Bạn có thể đã quên những gì bạn đã cố gắng đạt được với chức năng này, và điều đó sẽ khiến việc bạn viết tắt làm thế nào nó trở nên khó khăn.

Ví dụ sau đây rõ ràng hơn nhiều. Nếu bạn quay lại mã này một vài ngày sau khi viết nó, bạn sẽ vẫn có thể đọc và hiểu mục đích của chức năng này:

# Recommended
def multiply_by_two(x):
    return x * 2

Triết lý tương tự áp dụng cho tất cả các loại dữ liệu và đối tượng khác trong Python. Luôn cố gắng sử dụng các tên ngắn gọn nhưng mô tả nhất có thể.

Bố cục mã

"Đẹp tốt hơn xấu."

- Zen of Python

Làm thế nào bạn đưa ra mã của bạn có một vai trò rất lớn trong cách nó có thể đọc được. Trong phần này, bạn sẽ học cách thêm khoảng trắng dọc để cải thiện khả năng đọc mã của bạn. Bạn cũng sẽ học cách xử lý giới hạn dòng 79 ký tự được đề xuất trong PEP 8.

Các dòng trống

Khoảng trắng dọc, hoặc các dòng trống, có thể cải thiện đáng kể khả năng đọc mã của bạn. Mã mà Lừa bị bó lại với nhau có thể quá sức và khó đọc. Tương tự, quá nhiều dòng trống trong mã của bạn làm cho nó trông rất thưa thớt và người đọc có thể cần phải cuộn nhiều hơn mức cần thiết. Dưới đây là ba hướng dẫn chính về cách sử dụng khoảng trắng dọc.

Các chức năng và lớp cấp cao nhất với hai dòng trống. Các chức năng và các lớp cấp cao nhất nên được khép kín và xử lý các chức năng riêng biệt. Thật hợp lý khi đặt thêm không gian thẳng đứng xung quanh chúng, để nó rõ ràng chúng là riêng biệt: Top-level functions and classes should be fairly self-contained and handle separate functionality. It makes sense to put extra vertical space around them, so that it’s clear they are separate:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None

Định nghĩa phương thức xung quanh bên trong các lớp với một dòng trống duy nhất. Bên trong một lớp, các chức năng đều liên quan đến nhau. Nó thực hành tốt chỉ để lại một dòng duy nhất giữa họ: Inside a class, functions are all related to one another. It’s good practice to leave only a single line between them:

class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None

Sử dụng các dòng trống một cách tiết kiệm các chức năng để hiển thị các bước rõ ràng. Đôi khi, một chức năng phức tạp phải hoàn thành một số bước trước câu lệnh

def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
9. Để giúp người đọc hiểu logic bên trong hàm, có thể hữu ích để để lại một đường trống giữa mỗi bước. Sometimes, a complicated function has to complete several steps before the
def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
9 statement. To help the reader understand the logic inside the function, it can be helpful to leave a blank line between each step.

Trong ví dụ dưới đây, có một hàm để tính phương sai của danh sách. Đây là vấn đề hai bước, vì vậy tôi đã chỉ ra mỗi bước bằng cách để lại một đường trống giữa chúng. Ngoài ra còn có một dòng trống trước câu lệnh

def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
9. Điều này giúp người đọc thấy rõ những gì đã trả lại:

def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2

Nếu bạn sử dụng một khoảng trắng dọc, nó có thể cải thiện đáng kể khả năng đọc mã của bạn. Nó giúp người đọc hiểu trực quan cách mã của bạn chia thành các phần và cách các phần đó liên quan đến nhau.

Độ dài dòng tối đa và phá vỡ đường

PEP 8 gợi ý các dòng nên được giới hạn ở 79 ký tự. Điều này là do nó cho phép bạn mở nhiều tệp bên cạnh nhau, đồng thời tránh việc gói dòng.

Tất nhiên, việc giữ tuyên bố cho 79 ký tự hoặc ít hơn không phải lúc nào cũng có thể. PEP 8 phác thảo các cách để cho phép các câu lệnh chạy qua một số dòng.

Python sẽ giả định tiếp tục dòng nếu mã được chứa trong ngoặc đơn, dấu ngoặc hoặc niềng răng:

def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one

Nếu không thể sử dụng tiếp tục ngụ ý, thì bạn có thể sử dụng dấu gạch chéo ngược để phá vỡ các dòng thay thế:

from mypkg import example1, \
    example2, example3

Tuy nhiên, nếu bạn có thể sử dụng tiếp tục ngụ ý, thì bạn nên làm như vậy.

Nếu phá vỡ dòng cần xảy ra xung quanh các toán tử nhị phân, như

from mypkg import example1, \
    example2, example3
1 và
from mypkg import example1, \
    example2, example3
2, nó sẽ xảy ra trước toán tử. Quy tắc này bắt nguồn từ toán học. Các nhà toán học đồng ý rằng phá vỡ trước khi các nhà khai thác nhị phân cải thiện khả năng đọc. So sánh hai ví dụ sau.

Dưới đây là một ví dụ về việc phá vỡ trước một toán tử nhị phân:

# Recommended
total = (first_variable
         + second_variable
         - third_variable)

Bạn có thể ngay lập tức thấy biến nào đang được thêm hoặc trừ, vì toán tử nằm ngay bên cạnh biến được vận hành.

Bây giờ, hãy để Lừa xem một ví dụ về việc phá vỡ sau một nhà điều hành nhị phân:

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
0

Ở đây, nó khó hơn để xem biến nào đang được thêm vào và cái nào được trừ đi.

Phá vỡ trước khi các nhà khai thác nhị phân tạo ra mã dễ đọc hơn, vì vậy PEP 8 khuyến khích nó. Mã liên tục bị phá vỡ sau khi một toán tử nhị phân vẫn tuân thủ PEP 8. Tuy nhiên, bạn đã khuyến khích phá vỡ trước một nhà điều hành nhị phân.

Vết lõm

Không nên có một người khác và tốt nhất là chỉ có một cách rõ ràng để làm điều đó.

- Zen of Python

Thụt lề, hoặc khoảng trắng hàng đầu, là vô cùng quan trọng ở Python. Mức độ thụt của các dòng mã trong Python xác định cách các câu lệnh được nhóm lại với nhau.

Xem xét ví dụ sau:

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
1

Tuyên bố

from mypkg import example1, \
    example2, example3
3 thụt lề cho phép Python biết rằng nó chỉ nên được thực thi nếu câu lệnh
from mypkg import example1, \
    example2, example3
4 trả về
from mypkg import example1, \
    example2, example3
5. Cùng thụt tương tự áp dụng để nói với Python nên thực thi mã nào khi một hàm được gọi hoặc mã nào thuộc về một lớp nhất định.

Các quy tắc thụt chính được đặt ra bởi PEP 8 là như sau:

  • Sử dụng 4 không gian liên tiếp để chỉ ra thụt lề.
  • Thích không gian hơn các tab.

Tab so với không gian

Như đã đề cập ở trên, bạn nên sử dụng không gian thay vì các tab khi thụt mã. Bạn có thể điều chỉnh các cài đặt trong trình soạn thảo văn bản của mình để xuất 4 khoảng trắng thay vì ký tự tab, khi bạn nhấn phím tab.Tab key.

Nếu bạn sử dụng Python 2 và đã sử dụng hỗn hợp các tab và không gian để thụt mã mã của bạn, bạn đã giành được lỗi khi cố gắng chạy nó. Để giúp bạn kiểm tra tính nhất quán, bạn có thể thêm cờ

from mypkg import example1, \
    example2, example3
6 khi chạy mã Python 2 từ dòng lệnh. Thông dịch viên sẽ đưa ra các cảnh báo khi bạn không phù hợp với việc sử dụng các tab và không gian của bạn:

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
2

Thay vào đó, nếu bạn sử dụng cờ

from mypkg import example1, \
    example2, example3
7, trình thông dịch sẽ đưa ra lỗi thay vì cảnh báo và mã của bạn sẽ không chạy. Lợi ích của việc sử dụng phương pháp này là thông dịch viên cho bạn biết sự không nhất quán ở đâu:

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
3

Python 3 không cho phép trộn các tab và không gian. Do đó, nếu bạn đang sử dụng Python 3, thì các lỗi này sẽ được cấp tự động:

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
4

Bạn có thể viết mã Python bằng các tab hoặc không gian cho biết thụt lề. Nhưng, nếu bạn sử dụng Python 3, bạn phải phù hợp với sự lựa chọn của mình. Nếu không, mã của bạn sẽ không chạy. PEP 8 khuyên bạn nên luôn sử dụng 4 không gian liên tiếp để chỉ ra thụt lề.

Vết lõm sau khi phá vỡ dòng

Khi bạn sử dụng các tiếp tục dòng để giữ các dòng dưới 79 ký tự, sẽ rất hữu ích khi sử dụng thụt vào để cải thiện khả năng đọc. Nó cho phép người đọc phân biệt giữa hai dòng mã và một dòng mã duy nhất kéo dài hai dòng. Có hai kiểu thụt bạn có thể sử dụng.

Đầu tiên trong số này là căn chỉnh khối thụt lề với dấu phân cách mở:

def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one

Đôi khi bạn có thể thấy rằng chỉ cần 4 khoảng trống để sắp xếp với dấu phân cách mở. Điều này thường sẽ xảy ra trong các câu lệnh

from mypkg import example1, \
    example2, example3
4 trải rộng trên nhiều dòng dưới dạng
from mypkg import example1, \
    example2, example3
4, không gian và khung mở tạo thành 4 ký tự. Trong trường hợp này, có thể khó xác định nơi khối mã lồng nhau bên trong câu lệnh
from mypkg import example1, \
    example2, example3
4 bắt đầu:

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
6

Trong trường hợp này, PEP 8 cung cấp hai lựa chọn thay thế để giúp cải thiện khả năng đọc:

  • Thêm một bình luận sau điều kiện cuối cùng. Do sự nổi bật của cú pháp trong hầu hết các biên tập viên, điều này sẽ tách các điều kiện khỏi mã lồng nhau:

    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    7

  • Thêm thụt thêm vào tiếp tục dòng:

    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    8

Một phong cách thay thế của thụt sau khi phá vỡ dòng là một thụt lề treo. Đây là một thuật ngữ đánh máy có nghĩa là mỗi dòng nhưng đầu tiên trong một đoạn hoặc câu lệnh được thụt vào. Bạn có thể sử dụng thụt lề treo để biểu thị trực quan một dòng mã. Đây là một ví dụ:hanging indent. This is a typographical term meaning that every line but the first in a paragraph or statement is indented. You can use a hanging indent to visually represent a continuation of a line of code. Here’s an example:

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
9

Khi sử dụng thụt lề treo, hãy thêm thụt lề để phân biệt dòng tiếp tục với mã chứa bên trong hàm. Ví dụ sau rất khó đọc vì mã bên trong hàm ở cùng mức thụt với các dòng tiếp tục:

# Not recommended
def db(x):
    return x * 2
0

Thay vào đó, nó tốt hơn để sử dụng một thụt lề kép trên tiếp tục dòng. Điều này giúp bạn phân biệt giữa các đối số chức năng và cơ thể chức năng, cải thiện khả năng đọc:

# Not recommended
def db(x):
    return x * 2
1

Khi bạn viết mã tuân thủ PEP 8, giới hạn dòng 79 ký tự buộc bạn phải thêm các lần phá vỡ dòng trong mã của bạn. Để cải thiện khả năng đọc, bạn nên thụt vào một dòng tiếp tục để cho thấy rằng đó là một dòng tiếp tục. Có hai cách để làm điều này. Đầu tiên là căn chỉnh khối thụt lề với dấu phân cách mở. Thứ hai là sử dụng một thụt lề treo. Bạn có thể tự do chọn phương pháp nào bạn sử dụng sau khi phá vỡ dòng.

Đâu để đặt nẹp đóng cửa ở đâu

Tiếp tục dòng cho phép bạn phá vỡ các đường bên trong dấu ngoặc đơn, ngoặc hoặc niềng răng. Nó dễ dàng quên đi nẹp đóng, nhưng nó rất quan trọng để đặt nó ở đâu đó hợp lý. Nếu không, nó có thể gây nhầm lẫn cho người đọc. PEP 8 cung cấp hai tùy chọn cho vị trí của nẹp đóng trong các tiếp tục dòng ngụ ý:

  • Xếp hàng nẹp đóng với ký tự không phải là màu đầu tiên của dòng trước:

    # Not recommended
    def db(x):
        return x * 2
    
    2

  • Xếp hàng nẹp đóng với ký tự đầu tiên của dòng bắt đầu cấu trúc:

    # Not recommended
    def db(x):
        return x * 2
    
    3

Bạn có thể tự do chọn tùy chọn bạn sử dụng. Nhưng, như mọi khi, tính nhất quán là chìa khóa, vì vậy hãy cố gắng gắn bó với một trong các phương pháp trên.

Khoảng trắng trong biểu thức và câu lệnh

“Sắp sáng tốt hơn so với dày đặc.”

- Zen of Python

Whitespace có thể rất hữu ích trong các biểu thức và câu lệnh khi được sử dụng đúng cách. Nếu không có đủ khoảng trắng, thì mã có thể khó đọc, vì tất cả đều bị bó lại với nhau. Nếu có quá nhiều khoảng trắng, thì có thể khó kết hợp trực quan các thuật ngữ liên quan trong một tuyên bố.

Khoảng trắng xung quanh các nhà khai thác nhị phân

Bao quanh các toán tử nhị phân sau với một không gian ở hai bên:

  • Toán tử chuyển nhượng (

    # Recommended
    total = (first_variable
             + second_variable
             - third_variable)
    
    1,
    # Recommended
    total = (first_variable
             + second_variable
             - third_variable)
    
    2,
    # Recommended
    total = (first_variable
             + second_variable
             - third_variable)
    
    3, v.v.)

  • So sánh (

    # Recommended
    total = (first_variable
             + second_variable
             - third_variable)
    
    4,
    # Recommended
    total = (first_variable
             + second_variable
             - third_variable)
    
    5,
    # Recommended
    total = (first_variable
             + second_variable
             - third_variable)
    
    6,
    # Recommended
    total = (first_variable
             + second_variable
             - third_variable)
    
    7.

  • Booleans (

    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    04,
    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    05,
    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    06)

Khi có nhiều hơn một toán tử trong một câu lệnh, việc thêm một khoảng trống trước và sau mỗi người vận hành có thể trông khó hiểu. Thay vào đó, tốt hơn là chỉ thêm khoảng trắng xung quanh các toán tử với mức độ ưu tiên thấp nhất, đặc biệt là khi thực hiện thao tác toán học. Dưới đây là một vài ví dụ:

# Not recommended
def db(x):
    return x * 2
4

Bạn cũng có thể áp dụng điều này cho các câu lệnh

from mypkg import example1, \
    example2, example3
4 trong đó có nhiều điều kiện:

# Not recommended
def db(x):
    return x * 2
5

Trong ví dụ trên, toán tử

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
04 có mức độ ưu tiên thấp nhất. Do đó, có thể rõ ràng hơn để thể hiện tuyên bố
from mypkg import example1, \
    example2, example3
4 như dưới đây:

# Not recommended
def db(x):
    return x * 2
6

Bạn có thể tự do chọn loại nào rõ ràng hơn, với cảnh báo rằng bạn phải sử dụng cùng một lượng khoảng trắng ở hai bên của toán tử.

Điều sau đây không được chấp nhận:

# Not recommended
def db(x):
    return x * 2
7

Trong các lát cắt, các dấu chấm là một nhà khai thác nhị phân. Do đó, các quy tắc được nêu trong phần trước được áp dụng và phải có cùng một lượng khoảng trắng ở hai bên. Các ví dụ sau đây về các lát danh sách là hợp lệ:

# Not recommended
def db(x):
    return x * 2
8

Tóm lại, bạn nên bao quanh hầu hết các nhà khai thác với khoảng trắng. Tuy nhiên, có một số cảnh báo cho quy tắc này, chẳng hạn như trong các đối số chức năng hoặc khi bạn kết hợp nhiều toán tử trong một câu lệnh.

Khi nào nên tránh thêm khoảng trắng

Trong một số trường hợp, việc thêm khoảng trắng có thể làm cho mã khó đọc hơn. Quá nhiều khoảng trắng có thể làm cho mã quá thưa và khó theo dõi. PEP 8 phác thảo các ví dụ rất rõ ràng trong đó khoảng trắng là không phù hợp.

Nơi quan trọng nhất để tránh thêm khoảng trắng là ở cuối dòng. Điều này được gọi là khoảng trắng theo dõi. Nó là vô hình và có thể tạo ra các lỗi khó theo dõi.trailing whitespace. It is invisible and can produce errors that are difficult to trace.

Danh sách sau đây phác thảo một số trường hợp bạn nên tránh thêm khoảng trắng:

  • Ngay bên trong dấu ngoặc đơn, dấu ngoặc hoặc niềng răng:

    # Not recommended
    def db(x):
        return x * 2
    
    9

  • Trước dấu phẩy, dấu chấm phẩy hoặc ruột kết:

    # Recommended
    def multiply_by_two(x):
        return x * 2
    
    0

  • Trước dấu ngoặc đơn mở ra danh sách đối số của một cuộc gọi chức năng:

    # Recommended
    def multiply_by_two(x):
        return x * 2
    
    1

  • Trước khung mở bắt đầu một chỉ mục hoặc lát cắt:

    # Recommended
    def multiply_by_two(x):
        return x * 2
    
    2

  • Giữa dấu phẩy kéo dài và dấu ngoặc đơn kết thúc:

    # Recommended
    def multiply_by_two(x):
        return x * 2
    
    3

  • Để sắp xếp các toán tử chuyển nhượng:

    # Recommended
    def multiply_by_two(x):
        return x * 2
    
    4

Hãy chắc chắn rằng không có khoảng trắng nào ở bất cứ đâu trong mã của bạn. Có những trường hợp khác trong đó PEP 8 không khuyến khích thêm khoảng trắng, chẳng hạn như ngay bên trong ngoặc, cũng như trước dấu phẩy và đại quý. Bạn cũng không bao giờ nên thêm khoảng trắng bổ sung để sắp xếp các nhà khai thác.

Khuyến nghị lập trình

"Đơn giản là tốt hơn phức tạp."

- Zen of Python

Whitespace có thể rất hữu ích trong các biểu thức và câu lệnh khi được sử dụng đúng cách. Nếu không có đủ khoảng trắng, thì mã có thể khó đọc, vì tất cả đều bị bó lại với nhau. Nếu có quá nhiều khoảng trắng, thì có thể khó kết hợp trực quan các thuật ngữ liên quan trong một tuyên bố.

Khoảng trắng xung quanh các nhà khai thác nhị phân You’ll often need to check if a Boolean value is True or False. When doing so, it is intuitive to do this with a statement like the one below:

# Recommended
def multiply_by_two(x):
    return x * 2
5

Bao quanh các toán tử nhị phân sau với một không gian ở hai bên:

# Recommended
def multiply_by_two(x):
    return x * 2
6

Toán tử chuyển nhượng (

# Recommended
total = (first_variable
         + second_variable
         - third_variable)
1,
# Recommended
total = (first_variable
         + second_variable
         - third_variable)
2,
# Recommended
total = (first_variable
         + second_variable
         - third_variable)
3, v.v.)

So sánh (

# Recommended
total = (first_variable
         + second_variable
         - third_variable)
4,
# Recommended
total = (first_variable
         + second_variable
         - third_variable)
5,
# Recommended
total = (first_variable
         + second_variable
         - third_variable)
6,
# Recommended
total = (first_variable
         + second_variable
         - third_variable)
7.
If you want to check whether a list is empty, you might be tempted to check the length of the list. If the list is empty, it’s length is
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
18 which is equivalent to
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
11 when used in an
from mypkg import example1, \
    example2, example3
4 statement. Here’s an example:

# Recommended
def multiply_by_two(x):
    return x * 2
7

Booleans (

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
04,
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
05,
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
06)

# Recommended
def multiply_by_two(x):
    return x * 2
8

Mặc dù cả hai ví dụ sẽ in ra

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
21, tùy chọn thứ hai đơn giản hơn, vì vậy PEP 8 khuyến khích nó.

Sử dụng

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
01 thay vì
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
23 trong các câu lệnh
from mypkg import example1, \
    example2, example3
4. Nếu bạn đang cố gắng kiểm tra xem một biến có giá trị xác định hay không, có hai tùy chọn. Đầu tiên là đánh giá một tuyên bố
from mypkg import example1, \
    example2, example3
4 với
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
26, như trong ví dụ dưới đây:
If you are trying to check whether a variable has a defined value, there are two options. The first is to evaluate an
from mypkg import example1, \
    example2, example3
4 statement with
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
26, as in the example below:

# Recommended
def multiply_by_two(x):
    return x * 2
9

Tùy chọn thứ hai sẽ là đánh giá

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
27 và sau đó có tuyên bố
from mypkg import example1, \
    example2, example3
4 dựa trên
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
05 Kết quả:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None
0

Mặc dù cả hai tùy chọn sẽ được đánh giá chính xác, nhưng đầu tiên đơn giản hơn, vì vậy PEP 8 khuyến khích nó.

Don Tiết sử dụng

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
30 khi bạn có nghĩa là
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
31. Đôi khi, bạn có thể có một chức năng với các đối số là
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
32 theo mặc định. Một sai lầm phổ biến khi kiểm tra xem một đối số như vậy,
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
33, đã được đưa ra một giá trị khác là sử dụng như sau:
Sometimes, you may have a function with arguments that are
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
32 by default. A common mistake when checking if such an argument,
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
33, has been given a different value is to use the following:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None
1

Mã này kiểm tra rằng

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
33 là sự thật. Thay vào đó, bạn muốn kiểm tra xem
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
33 là
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
36, vì vậy sẽ tốt hơn nếu sử dụng như sau:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None
2

Sai lầm được thực hiện ở đây là giả định rằng

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
36 và sự thật là tương đương. Bạn có thể đã đặt
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
38. Như chúng ta đã thấy ở trên, các danh sách trống được đánh giá là giả mạo trong Python. Vì vậy, mặc dù đối số
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
33 đã được chỉ định, điều kiện không được đáp ứng và do đó, mã trong phần thân của câu lệnh
from mypkg import example1, \
    example2, example3
4 sẽ không được thực thi.

Sử dụng

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
41 và
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
42 thay vì cắt. Nếu bạn đang cố gắng kiểm tra xem một chuỗi
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
43 có được tiền tố hay được hậu tố, với từ
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
44, có vẻ hợp lý khi sử dụng cắt danh sách. Tuy nhiên, việc cắt danh sách dễ bị lỗi và bạn phải mã hóa số lượng ký tự trong tiền tố hoặc hậu tố. Nó cũng không rõ ràng với ai đó ít quen thuộc với danh sách Python cắt giảm những gì bạn đang cố gắng đạt được:
If you were trying to check if a string
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
43 was prefixed, or suffixed, with the word
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
44, it might seem sensible to use list slicing. However, list slicing is prone to error, and you have to hardcode the number of characters in the prefix or suffix. It is also not clear to someone less familiar with Python list slicing what you are trying to achieve:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None
3

Tuy nhiên, điều này không thể đọc được như sử dụng

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
41:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None
4

Tương tự, nguyên tắc tương tự được áp dụng khi bạn kiểm tra hậu tố. Ví dụ dưới đây phác thảo cách bạn có thể kiểm tra xem một chuỗi kết thúc trong

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
46:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None
5

Trong khi kết quả là chính xác, ký hiệu hơi khó hiểu và khó đọc. Thay vào đó, bạn có thể sử dụng

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
42 như trong ví dụ dưới đây:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None
6

Như với hầu hết các khuyến nghị lập trình này, mục tiêu là khả năng đọc và đơn giản. Trong Python, có nhiều cách khác nhau để thực hiện cùng một hành động, vì vậy các hướng dẫn về phương pháp nào để chọn là hữu ích.

Khi nào bỏ qua Pep 8

Câu trả lời ngắn gọn cho câu hỏi này là không bao giờ. Nếu bạn theo PEP 8 đến thư, bạn có thể đảm bảo rằng bạn sẽ có mã sạch, chuyên nghiệp và có thể đọc được. Điều này sẽ có lợi cho bạn cũng như các cộng tác viên và nhà tuyển dụng tiềm năng.

Tuy nhiên, một số hướng dẫn trong PEP 8 là bất tiện trong các trường hợp sau:

  • Nếu tuân thủ PEP 8 sẽ phá vỡ khả năng tương thích với phần mềm hiện có
  • Nếu mã xung quanh những gì bạn làm việc không phù hợp với PEP 8
  • Nếu mã cần giữ tương thích với các phiên bản Python cũ hơn

Mẹo và thủ thuật để giúp đảm bảo mã của bạn theo PEP 8

Có rất nhiều điều cần nhớ để đảm bảo mã của bạn tuân thủ PEP 8. Nó có thể là một thứ tự cao để ghi nhớ tất cả các quy tắc này khi bạn phát triển mã. Nó đặc biệt tốn thời gian để cập nhật các dự án trong quá khứ để tuân thủ PEP 8. May mắn thay, có những công cụ có thể giúp tăng tốc quá trình này. Có hai loại công cụ mà bạn có thể sử dụng để thực thi tuân thủ PEP 8: Linters và AutoforMtones.

Linters

Linters là các chương trình phân tích lỗi mã và cờ. Họ cung cấp các đề xuất về cách khắc phục lỗi. Linters đặc biệt hữu ích khi được cài đặt làm phần mở rộng cho trình soạn thảo văn bản của bạn, vì chúng gắn cờ lỗi và các vấn đề về phong cách trong khi bạn viết. Trong phần này, bạn sẽ thấy một phác thảo về cách các linters hoạt động, với các liên kết đến các phần mở rộng trình soạn thảo văn bản ở cuối.

Các lớp lót tốt nhất cho mã Python là như sau:

  • >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    48 là một công cụ để kiểm tra mã Python của bạn đối với một số quy ước về kiểu trong PEP 8. is a tool to check your Python code against some of the style conventions in PEP 8.

    Cài đặt

    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    48 bằng cách sử dụng
    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    50:

    class MyFirstClass:
        pass
    
    
    class MySecondClass:
        pass
    
    
    def top_level_function():
        return None
    
    7

    Bạn có thể chạy

    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    48 từ thiết bị đầu cuối bằng lệnh sau:

    class MyFirstClass:
        pass
    
    
    class MySecondClass:
        pass
    
    
    def top_level_function():
        return None
    
    8

  • >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    52 là một công cụ kết hợp trình gỡ lỗi,
    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    53, với
    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    48.
    is a tool that combines a debugger,
    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    53, with
    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    48.

    Cài đặt

    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    52 bằng cách sử dụng
    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    50:

    Chạy

    >>> # Recommended
    >>> name = 'John Smith'
    >>> first_name, last_name = name.split()
    >>> print(last_name, first_name, sep=', ')
    'Smith, John'
    
    52 từ thiết bị đầu cuối bằng lệnh sau:

    class MyFirstClass:
        pass
    
    
    class MySecondClass:
        pass
    
    
    def top_level_function():
        return None
    
    9

    Một ví dụ về đầu ra cũng được hiển thị.

Chúng cũng có sẵn dưới dạng tiện ích mở rộng cho Atom, văn bản tuyệt vời, mã Visual Studio và VIM. Bạn cũng có thể tìm thấy các hướng dẫn về thiết lập văn bản siêu phàm và vim để phát triển Python, cũng như tổng quan về một số biên tập viên văn bản phổ biến tại Real Python.

Autoformatters

AutoforMatters là các chương trình tái cấu trúc mã của bạn để tự động tuân thủ PEP 8. Khi chương trình như vậy là

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
58, mã tự động theo hầu hết các quy tắc trong PEP 8. Một sự khác biệt lớn là nó giới hạn độ dài dòng là 88 ký tự, thay vì 79. Tuy nhiên, bạn có thể ghi đè lên điều này bằng cách thêm cờ dòng lệnh, khi bạn 'sẽ thấy trong một ví dụ dưới đây.

Cài đặt

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
58 bằng cách sử dụng
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
50. Nó yêu cầu Python 3.6+ để chạy:

Nó có thể được chạy qua dòng lệnh, như với các linters. Hãy nói rằng bạn bắt đầu với mã sau đó là PEP 8 tuân thủ trong một tệp có tên

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
61:

class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
0

Sau đó, bạn có thể chạy lệnh sau thông qua dòng lệnh:

class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
1

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
61 sẽ tự động được định dạng lại để trông như thế này:

class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
2

Nếu bạn muốn thay đổi giới hạn độ dài dòng, thì bạn có thể sử dụng cờ

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
63:

class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None
3

Hai tự động tự động khác,

>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
64 và
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
65, thực hiện các hành động tương tự như những gì
>>> # Recommended
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'
58 làm.

Một hướng dẫn Python thực sự khác, Chất lượng mã Python: Công cụ & Thực tiễn tốt nhất của Alexander Van Tol, đưa ra lời giải thích kỹ lưỡng về cách sử dụng các công cụ này.

Sự kết luận

Bây giờ bạn đã biết cách viết mã python chất lượng cao, có thể đọc được bằng cách sử dụng các hướng dẫn được trình bày trong PEP 8. Trong khi các hướng dẫn có thể có vẻ như là thiết kế, theo chúng thực sự có thể cải thiện mã của bạn, đặc biệt là khi chia sẻ mã của bạn với các nhà tuyển dụng tiềm năng hoặc cộng tác viên.

Trong hướng dẫn này, bạn đã học được:

  • Pep 8 là gì và tại sao nó tồn tại
  • Tại sao bạn nên đặt mục tiêu viết mã tuân thủ PEP 8
  • Cách viết mã tuân thủ PEP 8

Trên hết, bạn cũng đã thấy cách sử dụng linters và autoformatters để kiểm tra mã của bạn theo hướng dẫn của PEP 8.

Nếu bạn muốn tìm hiểu thêm về PEP 8, thì bạn có thể đọc tài liệu đầy đủ hoặc truy cập pep8.org, trong đó chứa thông tin tương tự nhưng đã được định dạng độc đáo. Trong các tài liệu này, bạn sẽ tìm thấy phần còn lại của hướng dẫn PEP 8 không được đề cập trong hướng dẫn này.

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: viết mã Pythonic đẹp với PEP 8 This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Writing Beautiful Pythonic Code With PEP 8

Các dòng Python nên kéo dài bao lâu?

Độ dài dòng tối đa và phá vỡ dòng PEP 8 gợi ý các dòng phải được giới hạn ở 79 ký tự. Điều này là do nó cho phép bạn mở nhiều tệp bên cạnh nhau, đồng thời tránh việc gói dòng. Tất nhiên, việc giữ tuyên bố cho 79 ký tự hoặc ít hơn không phải lúc nào cũng có thể.79 characters. This is because it allows you to have multiple files open next to one another, while also avoiding line wrapping. Of course, keeping statements to 79 characters or less is not always possible.

Giới hạn độ dài được đề xuất cho một dòng mã là gì?

Hầu hết đề xuất một giới hạn từ 80 đến 100 ký tự. Lưu ý mức độ hiệu quả của GO không đề xuất tối đa cố định: Go không có giới hạn độ dài dòng.between 80 and 100 characters. Note how Effective Go doesn't recommend a fixed maximum: Go has no line length limit.

Một dòng mã nên có bao nhiêu ký tự?

Nếu có bất kỳ tiêu chuẩn công nghiệp được chấp nhận nào cho chiều rộng dòng tối đa, thì đó là 80 ký tự.Tôi đã sử dụng tối đa đó trong nhiều năm và đó là mức tối đa tốt.Giống như tất cả các lập trình viên khác, mã của người khác làm tôi khó chịu.Khó chịu phổ biến nhất là mọi người viết mã quá rộng.80 characters. I've used that maximum for years, and it's a good maximum. Like all other programmers, other people's code annoys me. The most common annoyance is that people write too wide code.

Các ký tự tối đa mà một dòng có thể chứa trong Python là gì?

Theo PEP, độ dài dòng tối đa vẫn là 79. Đã đến lúc cập nhật điều này.Hầu hết các nhà phát triển sử dụng hệ thống với thông số kỹ thuật gốc.Khả năng đọc, hơi hẹp nếu người ta sử dụng tên biến dài hơn.79. Its time to update this. Most of the developers use system with descent spec. readability, are a bit narrow if one uses longer variable names.