Кто из нас может прочитать этот текст? Трудно понять испорченный почерк. Текст пишется один раз, но мы читаем его снова и снова. Точно так же трудно понять нечитаемый и неструктурированный код. Вы можете получить выгоду как программист только тогда, когда сможете лучше выразить свой код.

Однажды написав, вы никогда не напишете это снова. Но вам обязательно придется ее перечитать. Этот фрагмент кода может остаться частью проекта, над которым вы работаете. Каждый раз, возвращаясь к этому файлу, вы должны помнить, что делает этот код и почему вы его написали. Может быть трудно вспомнить, что делает фрагмент кода через несколько дней или недель после того, как вы его написали. Короче говоря, удобочитаемость.

def f(x):
    f=1
    for i in range(1,x+1):
        f = f * i
    return x

Есть предположения, что вернет приведенный выше код? Он возвращает факториал числа (x). Взломать сложно. Представьте, что существует более 1000 строк кода, написанных таким образом. Чтобы понять код, написанный вами месяц назад, потребуется день или два.

Здесь на помощь приходит PEP. Если вы следуете PEP 8, вы можете быть уверены, что правильно назвали свои переменные. Вы будете знать, что добавили достаточно свободного места, поэтому вам будет проще выполнять логические шаги в коде. Вы также хорошо прокомментировали свой код. Все это будет означать, что ваш код будет более читабельным и к нему будет легче вернуться.

Что такое ПКП?

Рекомендации, представленные в PEP, предназначены для улучшения читаемости кода и обеспечения его единообразия для широкого спектра кода Python.

Макет кода

1. Отступ

Отступы или начальные пробелы чрезвычайно важны в Python. Уровень отступа строк кода в Python определяет, как операторы группируются вместе.

Строки продолжения должны выравнивать обернутые элементы либо по вертикали, используя неявное соединение строк Python внутри скобок, скобок и фигурных скобок, либо используя висячий отступ . Висячий отступ - это стиль набора текста, при котором все строки в абзаце имеют отступ, кроме первой [3-й пример].

# Recommended
#1 Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
                         var_three, var_four)
#2 Add 4 spaces (an extra level of indentation) to distinguish arguments from the rest.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

#3 Hanging indents should add a level.
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

PEP не занимает явной позиции относительно того, как (и нужно ли) визуально отличать условные строки от вложенного набора внутри if-оператора. Приемлемые варианты в этой ситуации включают, но не ограничиваются:

# Recommended
# No extra indentation.
if (this_is_one_thing and
    that_is_another_thing):
    do_something()

# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

Закрывающая фигурная скобка / скобка / круглые скобки на многострочном тексте может быть либо под первым непробельным символом последней строки списка, либо под первым символом строки, с которой начинается многострочная конструкция.

# Recommended
my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
my_list = [
    1, 2, 3,
    4, 5, 6,
]

Примечание. Используйте 4 пробела на каждый уровень отступа. Предпочтительный метод отступа - это пробелы. Вкладки следует использовать исключительно для обеспечения согласованности с кодом, который уже имеет отступ с вкладками. Python 3 запрещает смешивать использование табуляции и пробелов для отступов.

2. Бинарный оператор

Рекомендуемый стиль - разрыв после бинарных операторов. Но в приведенном ниже примере глазу нужно проделать дополнительную работу, чтобы определить, какие элементы добавляются, а какие вычитаются.

# Not Recommended
# Operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

В коде Python допустимо прерывание до или после бинарного оператора, если соглашение согласовано локально. Чтобы сделать его более читабельным, следование математической традиции обычно приводит к более читабельному коду:

# Recommended
# Easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

3. Импорт

Импорт обычно должен быть в отдельных строках:

# Recommended
import os
import sys
from subprocess import Popen, PIPE
# Not Recommended
import sys, os

Импорты должны быть написаны сверху и сгруппированы в следующем порядке:

  1. Стандартная библиотека импорта.
  2. Связанный сторонний импорт.
  3. Импорт для локального приложения / библиотеки.

Вы должны поместить пустую строку между каждой группой импорта.

Примечание. Следует избегать импорта подстановочных знаков (из ‹module› import *), поскольку из-за него неясно, какие имена присутствуют в пространстве имен, что сбивает с толку как читателей, так и многие автоматизированные инструменты.

4. Имена Dunder на уровне модуля

Имена Dunder, то есть с двумя ведущими и двумя завершающими знаками подчеркивания, такие как __all__, __author__, __version__, следует размещать после строки документации модуля, но перед любыми операторами импорта кроме из импорта __future__. Python требует, чтобы future-import появлялся в модуле перед любым другим кодом, кроме строк документации. Таким образом, порядок должен быть таким, как показано ниже:

# Recommended
"""This is docstrings. 
"""

from __future__ import barry_as_FLUFL

__all__ = ['a', 'b', 'c']
__version__ = '0.1'
__author__ = 'Cardinal Biggles'

import os
import sys

5. Строковые цитаты

В Python строки в одинарных кавычках и строки в двойных кавычках одинаковы. Этот PEP не дает рекомендаций по этому поводу. Выберите правило и придерживайтесь его. Однако, если строка содержит символы одинарных или двойных кавычек, используйте другой, чтобы избежать обратных косых черт в строке.

6. Пробелы

Пробелы могут быть очень полезны в выражениях и операторах при правильном использовании. Если пробелов недостаточно, код может быть трудночитаемым, так как все они сгруппированы вместе. Если пробелов слишком много, может быть сложно визуально объединить связанные термины в заявлении.

A) Окружите бинарные операторы (присваивание, сравнение или логическое значение) одним пробелом с каждой стороны. Когда = используется для присвоения значения по умолчанию аргументу функции, не заключайте его в пробелы.

# Recommended
def function(default_parameter=5):
    # ...


# Not recommended
def function(default_parameter = 5):
    # ...

Б) Когда в операторе используется более одного оператора, добавление одного пробела до и после каждого оператора может сбивать с толку. Вместо этого лучше добавлять пробелы вокруг операторов с самым низким приоритетом, особенно при выполнении математических манипуляций.

Вы также можете применить это к операторам if, где есть несколько условий. Оператор this and имеет самый низкий приоритет. Поэтому может быть более понятным выражение if, как показано ниже:

# Recommended
if x>5 and x%2==0:
    print('x is larger than 5 and divisible by 2!')

# Not recommended
if x > 5 and x % 2 == 0:
    print('x is larger than 5 and divisible by 2!')

7. Соглашения об именах

Что касается наследования, всегда решайте, должны ли методы класса и переменные экземпляра (вместе: «атрибуты») быть общедоступными или закрытыми. Если сомневаетесь, выберите закрытый; легче сделать его общедоступным позже, чем сделать публичный атрибут закрытым. Открытые атрибуты не должны иметь начальных подчеркиваний. Кроме того, если имя вашего общедоступного атрибута конфликтует с зарезервированным ключевым словом, добавьте один завершающий знак подчеркивания к имени вашего атрибута. Это предпочтительнее аббревиатуры или искаженного написания.

Рекомендации по программированию

  1. Не сравнивайте логические значения с True или False с помощью оператора эквивалентности.
# Recommended
if my_bool:
    return '6 is bigger than 5'

# Not recommended
my_bool = 6 > 5
if my_bool == True:
    return '6 is bigger than 5'

2. Используйте тот факт, что пустые последовательности ложны в if операторах.

# Recommended
my_list = []
if not my_list:
    print('List is empty!')

# Not recommended
my_list = []
if not len(my_list):
    print('List is empty!')

3. Используйте is not вместо not ... is в if операторах.

# Recommended
if x is not None:
    return 'x exists!'
# Not recommended
if not x is None:
    return 'x exists!'

4. Используйте ‘’ .startswith () и ‘’ .endswith () вместо нарезки строки для проверки префиксов или суффиксов.

# Recommended
if word.startswith('cat'):
    print('The word starts with "cat"')
# Not recommended
if word[:3] == 'cat':
    print('The word starts with "cat"')

5. При реализации операций упорядочивания с расширенными сравнениями лучше всего реализовать все шесть операций (__eq__, __ne__, __lt__, __le__, __gt__, __ge__), а не полагаться на другой код только для выполнения конкретного сравнения. Чтобы свести к минимуму требуемые усилия, декоратор functools.total_ordering () предоставляет инструмент для создания недостающих методов сравнения.

6. Всегда используйте оператор def вместо оператора присваивания, который связывает лямбда-выражение напрямую с идентификатором. Первая форма означает, что имя результирующего объекта функции - это именно «f», а не универсальное «‹lambda›».

#Recommended
def f(x): return 2*x
#Not Recommended
f = lambda x: 2*x