Следующий текст постепенно приходит к окончательному виду. Пока тут остаётся этот комментарий текст ниже может быть неполным и противоречивым.

Структура Кода

Программа начинается с подключения библиотек (import). Потом идут определения классов. Потом идут определения функций. Потом идет основная программа.

Запрещается подключать библиотеки и объявлять функции посередине кода.

Пустые места

Последняя строка должна завершаться символом конца строки. Пустых строк в конце файла быть не должно. В конце любой строки не должно быть пробелов.

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

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

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

Отдельные смысловые блоки в программе должны отделяться пустыми строками.

При этом стоит не забывать, что каждый такой блок требует комментариев.

Отступы

Величина отступа – четыре пробела. Использование символа табуляции (символа, с кодом 9) запрещается.

Длинные строки и переносы

Длину строки не должна превосходить 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())
    		

Перенос строки производиться после логического оператора, но не перед ним. Например:


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)
		

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

Допустимо:

#Выровнено по открывающему разделителю
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)
	

Структура программы

Имена переменных

Имена переменных, функций, типов должны быть осмысленными и отражать назначение. Слишком длинные имена, однако, не рекомендуются. В именах допускаются сокращения, которые не затрудняют понимание имени и назначения функций и переменных. Допускается использование односложных имен переменных для счетчиков (i, j, k), а также если это имя фигурирует в условии задачи (N, M, K, L). В именах должны использоваться только английские слова. Транслитерации русских слов не допускаются. Запрещается использование символов, отличных от латинских букв, цифр и символа подчеркивания. Если имя переменной или функции состоит из нескольких слов, то они должны разделяться символом подчеркивания или заглавными буквами. Например: Calc****Sqrt – допустимо calc_sqrt – божественно calculate_square_root – допустимо, но нежелательно (слишком длинное имя) vychislenie_kornya – недопустимо (используются русские имена) f – недопустимо (непонятно назначение функции) Обычно в качестве имён функций и переменных используются одно или несколько слов (или их сокращений) маленькими буквами с разделением символом подчёркивания. Например, result, factorial, calc_factorial(n), calc_fact(n), iter, find_next_value(), apples_num и т.д. Для перевода слов можно использовать словари ((http://www.multitran.ru/ мультитран)) или ((http://slovari.yandex.ru/ словари Lingvo на яндексе)) Имена констант записываются полностью заглавными буквами. Если имя константы состоит из нескольких слов, для их разделения используются подчеркивания. Например, EPSILON, MAX_SIZE. Имена массивов и названия типов структур должны записываться с заглавной буквы. ==== Арифметические операции ==== В одной строчке записывается одна арифметическая операция. Например: %%(php) a = b b = c %% Бинарные операции разделяются пробелом. После запятой ставится пробел. Между именем функции и скобками пробел не ставится, с внутренней стороны скобок пробелы не ставятся %%(php) a = b + 2 * c a = (b + 2) * c print(a, b, sep = "") %% ==== Использование констант ==== Не допускается использование чисел в программе, значение которых неочевидно. Например, запись while i < 179 или c = c + 32 недопустима. ==== Длина строки и переносы ==== Длина каждой строки не должна превышать 79 символов, а длина строки с комментарием — 72. Переносы длинных строк могут выглядеть так: %%(php) # Aligned with opening delimiter foo = long_function_name(var_one, var_two, var_three, var_four) # More indentation included to distinguish this from the rest. def long_function_name( var_one, var_two, var_three, var_four): print(var_one) %% ==== Отделение операторов пробелами ==== Пробелы не ставятся, если они примыкают к скобкам изнутри: %%(php) Yes: spam(ham[1], {eggs: 2}) No: spam( ham[ 1 ], { eggs: 2 } ) %% Пробелы не ставятся перед знаками препинания: %%(php) Yes: if x == 4: print x, y; x, y = y, x No: if x == 4 : print x , y ; x , y = y , x %% Пробелы не ставятся перед скобкой у функций или у списков: %%(php) Yes: spam(1) No: spam (1) Yes: dict['key'] = list[index] No: dict ['key'] = list [index] %% Бинарные операции обычно отделяются одним пробелом слева и справа. Однако, если в выражении есть операции разного приоритета (например, сложение и умножение, или сложение и возведение в степень), то пробелы у операции с бОльшим приоритетом могут быть пропущены. В любом случае количество пробелов слева и справа от оператора должно быть одинаковым. %%(php) Yes: i = i + 1 Yes: submitted += 1 Yes: x = x*2 - 1 Yes: hypot2 = x*x + y*y Yes: c = (a+b) * (a-b) No: i=i+1 No: submitted +=1 No: x = x * 2 - 1 No: hypot2 = x * x + y * y No: c = (a + b) * (a - b) %%