Этот документ содержит соглашения по кодированию для кода Python, входящего в стандартную библиотеку в основном дистрибутиве Python. Пожалуйста, ознакомьтесь с сопутствующим информационным PEP, описывающим стилевые рекомендации для кода C в C-реализации Python .

Введение

Этот документ содержит соглашения по кодированию для кода Python, входящего в стандартную библиотеку основной дистрибуции Python. Пожалуйста, ознакомьтесь с сопутствующим информационным PEP, описывающим стилевые руководящие принципы для кода C в C-реализации Python.

Этот документ и PEP 257 (Соглашения по Docstring) были адаптированы из оригинального эссе по стилю написания кода Python от Гвидо, с некоторыми дополнениями из стиля Барри .

Глупая последовательность — это домовой маленьких умов

Один из ключевых выводов Гвидо заключается в том, что код читается гораздо чаще, чем он пишется. Рекомендации, представленные здесь, предназначены для улучшения читаемости кода и обеспечения его согласованности в широком спектре кода на Python. Как говорится в PEP 20, «читаемость имеет значение».

Руководство по стилю касается согласованности. Согласованность с этим руководством по стилю важна. Согласованность в рамках проекта еще более важна. Согласованность в пределах одного модуля или функции является наиболее важной.

Но самое главное: знать, когда быть несогласованным — иногда руководство по стилю просто не применимо. Если есть сомнения, используйте свое лучшее суждение. Посмотрите на другие примеры и решите, что выглядит лучше. И не стесняйтесь спросить!

Два хороших основания для нарушения определенного правила:

  1. Когда применение правила сделало бы код менее читаемым, даже для кого-то, кто привык читать код, следующий правилам.
  2. Для согласованности с окружающим кодом, который также его нарушает (возможно, по историческим причинам) — хотя это также возможность убрать чью-то грязь (в истинном стиле XP).

Расположение кода

Отступы

Используйте 4 пробела на каждый уровень отступа.

Для действительно старых кодов, которые вы не хотите портить, вы можете продолжать использовать табуляцию с 8 пробелами.

Продолженные строки должны выравниваться с помощью вертикального выравнивания внутри скобок, либо с помощью висячего отступа. При использовании висячего отступа следует учитывать следующее: на первой строке не должно быть аргументов, и дальнейшие отступы должны четко обозначать продолжение строки.

Да:


foo = long_function_name(var_one, var_two,
                         var_three, var_four)


def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

Нет:


foo = long_function_name(var_one, var_two,
    var_three, var_four)


def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

Опционально:


foo = long_function_name(
  var_one, var_two,
  var_three, var_four)

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

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

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

my_list = [
    1, 2, 3,
    4, 5, 6,
]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)

Табуляция или пробелы?

Никогда не смешивайте табуляцию и пробелы.

Самый популярный способ отступов в Python — это использование только пробелов. Второй по популярности способ — это использование только табуляции. Код, отформатированный с использованием смеси табуляции и пробелов, должен быть преобразован в использование только пробелов. При вызове интерпретатора командной строки Python с опцией -t, он выдает предупреждения о коде, который незаконно смешивает табуляцию и пробелы. При использовании -tt эти предупреждения становятся ошибками. Эти опции настоятельно рекомендуются!

Для новых проектов настоятельно рекомендуется использовать только пробелы. Большинство редакторов имеют функции, которые облегчают это.

Максимальная длина строки

Ограничьте все строки максимальной длиной в 79 символов.

Во многих устройствах все еще используются строки длиной 80 символов; плюс, ограничение окон в 80 символов позволяет иметь несколько окон рядом. Автоматическое перенос строк на таких устройствах нарушает визуальную структуру кода, что делает его сложнее для понимания. Поэтому, пожалуйста, ограничьте все строки максимальной длиной в 79 символов. Для длинных блоков текста (документации или комментариев), рекомендуется ограничить длину до 72 символов.

Предпочтительный способ переноса длинных строк — использование неявного продолжения строки внутри скобок, квадратных скобок и фигурных скобок. Длинные строки могут быть разбиты на несколько строк, обернув выражения в скобки. Эти должны быть предпочтительнее использования обратного слэша для продолжения строки.

Обратные слэши могут быть все еще полезны в некоторых случаях. Например, длинные, множественные операторы with не могут использовать неявное продолжение, поэтому обратные слэши допустимы:

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())

Другой такой случай — операторы assert.

Убедитесь, что правильно отформатировали продолженную строку. Предпочтительное место для переноса вокруг бинарного оператора — после оператора, а не перед ним. Некоторые примеры:

class Rectangle(Blob):

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

### Отступы


Используйте 4 пробела на каждом уровне отступа.


Для действительно старых кодов, которые вы не хотите портить, вы можете продолжать использовать табуляцию в 8 пробелов.


Продолжающиеся строки должны выравниваться по обернутым элементам либо вертикально, используя неявное соединение строк в Python внутри скобок, квадратных скобок и фигурных скобок, либо с помощью висячего отступа. При использовании висячего отступа следует учитывать следующее: на первой строке не должно быть аргументов, и для четкого различения продолжающейся строки следует использовать дополнительный отступ.


Да:

foo = long_function_name(var_one, var_two, var_three, var_four)

def long_function_name( var_one, var_two, var_three, var_four): print(var_one)



Нет:

foo = long_function_name(var_one, var_two, var_three, var_four)

def long_function_name( var_one, var_two, var_three, var_four): print(var_one)



Опционально:

foo = long_function_name( var_one, var_two, var_three, var_four)



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

my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( ‘a’, ‘b’, ‘c’, ’d’, ’e’, ‘f’, )



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

my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( ‘a’, ‘b’, ‘c’, ’d’, ’e’, ‘f’, )





### Табы или пробелы?


Никогда не смешивайте табы и пробелы.


Самый популярный способ отступов в Python — это использование только пробелов. Второй по популярности способ — это использование только табов. Код, в котором смешаны табы и пробелы, должен быть преобразован в использование только пробелов. При вызове интерпретатора командной строки Python с опцией `-t`, он выдает предупреждения о коде, который незаконно смешивает табы и пробелы. При использовании `-tt` эти предупреждения становятся ошибками. Эти опции настоятельно рекомендуются!


Для новых проектов настоятельно рекомендуется использовать только пробелы вместо табов. Большинство редакторов имеют функции, которые облегчают этот процесс.




### Максимальная длина строки


Ограничьте длину всех строк максимум 79 символами.


Во многих устройствах все еще ограничена длина строк в 80 символов; кроме того, ограничение окон до 80 символов позволяет размещать несколько окон рядом. Стандартное перенос на таких устройствах нарушает визуальную структуру кода, что затрудняет его понимание. Поэтому, пожалуйста, ограничьте длину всех строк максимум 79 символами. Для длинных блоков текста (документационных строк или комментариев) рекомендуется ограничивать длину до 72 символов.


Предпочтительный способ переноса длинных строк — использование неявного продолжения строки в Python внутри круглых, квадратных и фигурных скобок. Длинные строки можно разбивать на несколько строк, заключая выражения в скобки. Этот метод следует использовать в предпочтение к использованию обратного слэша для продолжения строки.


Обратные слэши могут быть все еще уместны в некоторых случаях. Например, длинные, множественные `with`-операторы не могут использовать неявное продолжение, поэтому обратные слэши приемлемы:

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())



Другой такой случай — это операторы `assert`.


Убедитесь, что продолженная строка правильно отступлена. Предпочтительное место для переноса вокруг бинарного оператора — *после* оператора, а не перед ним. Вот несколько примеров:

class Rectangle(Blob):

def __init__(self, width, height,
             color='black', emphasis=None, highlight=0):
    if (width <mark> 0 and height </mark> 0 and
        color <mark> 'red' and emphasis </mark> 'strong' or
        highlight > 100):
        raise ValueError("sorry, you lose")
    if width <mark> 0 and height </mark> 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)




### Пустые строки


Отделяйте определения функций верхнего уровня и классов двумя пустыми
строками.


Определения методов внутри класса разделяются одной пустой
строкой.


Дополнительные пустые строки могут использоваться (экономно) для разделения групп
связанных функций. Пустые строки могут быть опущены между кучей
связанных однострочников (например, набором фиктивных реализаций).


Используйте пустые строки в функциях, экономно, для обозначения логических разделов.


Python принимает символ подачи страницы в виде управляющего символа (т.е. ^L) как
пробел; Многие инструменты рассматривают эти символы как разделители страниц, поэтому
вы можете использовать их для разделения страниц связанных разделов вашего файла.
Обратите внимание, что некоторые редакторы и веб-основанные средства просмотра кода могут не распознавать
управляющий символ ^L как подачу страницы и могут отображать другой глиф на его месте.




### Кодировки (PEP 263)


Код в основном дистрибутиве Python должен всегда использовать кодировку ASCII или
Latin-1 (также известную как ISO-8859-1). Для Python 3.0 и далее,
UTF-8 предпочтительнее Latin-1, см. PEP 3120.


Файлы, использующие ASCII, не должны иметь куки кодировки. Latin-1 (или UTF-8)
должны использоваться только тогда, когда комментарий или строка документации нуждается в упоминании
имени автора, требующего Latin-1; в противном случае, использование `\x`, `\u` или
`\U` экранирования является предпочтительным способом включения не-ASCII данных в
строковые литералы.


Для Python 3.0 и далее, следующая политика предписывается для
стандартной библиотеки (см. PEP 3131): Все идентификаторы в стандартной библиотеке Python
ДОЛЖНЫ использовать только идентификаторы ASCII, и ДОЛЖНЫ использовать английские слова везде, где это возможно
(во многих случаях используются аббревиатуры и технические термины, которые не являются английскими). Кроме того,
строковые литералы и комментарии также должны быть в ASCII. Единственными исключениями являются
(a) тестовые случаи, тестирующие не-ASCII функции, и
(b) имена авторов. Авторы, чьи имена не основаны на латинском алфавите,
ДОЛЖНЫ предоставить латинскую транслитерацию своих имен.


Открытые исходные проекты с глобальной аудиторией призываются принять
подобную политику.




### Импорты


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

Да: import os import sys

Нет: import sys, os



Но можно и так:

from subprocess import Popen, PIPE

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


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


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


Разместите любую соответствующую спецификацию `__all__` после импортов.
* Относительные импорты для внутрипакетных импортов настоятельно не рекомендуются. Всегда используйте абсолютный путь к пакету для всех импортов. Даже после полного внедрения PEP 328 в Python 2.5, его стиль явных относительных импортов активно не рекомендуется; абсолютные импорты более переносимы и обычно более читаемы.
* При импорте класса из модуля, содержащего классы, обычно допустимо писать так:

from myclass import MyClass from foo.bar.yourclass import YourClass



Если это вызывает конфликты локальных имен, то пишите их так:

import myclass import foo.bar.yourclass



и используйте “myclass.MyClass” и “foo.bar.yourclass.YourClass”.




## Пробелы в выражениях и операторах



### Частые недочеты


Избегайте лишних пробелов в следующих ситуациях:


* Непосредственно внутри круглых, квадратных или фигурных скобок.

Да: spam(ham[1], {eggs: 2}) Нет: spam( ham[ 1 ], { eggs: 2 } )

* Непосредственно перед запятой, точкой с запятой или двоеточием:

Да: if x == 4: print x, y; x, y = y, x Нет: if x == 4 : print x , y ; x , y = y , x

* Непосредственно перед открывающей скобкой, начинающей список аргументов вызова функции:

Да: spam(1) Нет: spam (1