Правила Написания Программ

Требования к программам

Преамбула

Сформулированные ниже правила базируются на следующих документах:

  1. PEP20. The Zen of Python (Дзен Питона). Если Вы программируете как-то иначе, то скорее всего Вы программируете не на Python. Оригинал и перевод.
  2. Общешкольные правила оформления программ. Если угодно, корпоративная этика. Сравнивать можно с этими и этими.
  3. PEP8. Style Guide for Python Code (Руководство по стилю кода на Python). Ejudge автоматически проверяет сдаваемые код на соответствие с этим руководством. Для автоматической проверки можно использовать утилиту pycodestyle (иногда она распространяется под старым именем pep8). Ejudge запускает её так:
    pep8.py -r --show-source  --ignore=W391,E251,E501,W292,W291,W293
    Оригинал и перевод.
  4. PEP257. Docstring Conventions (Соглашение о строках с документацией). Регулируют правила оформления docstrings. Это тот самый текст, который выводить функция help. Оригинал и перевод.
  5. PEP3107. Function Annotations (Аннотации функций). Регламентирует аннотации к функциям. Поскольку они обязательны для ВСЕХ функций, то стоит ознакомиться и не забывать. Оригинал и перевод.
  6. Правила написания кода проекта GNU. Большой сложный документ, охватывающий почти все возможные и невозможные случаи. Основной минус: они написаны для C/C++, поэтому некоторые технические детали к нам не относятся. Стоит обратить внимание на разделы 4.2, 4.4, 4.11, 4.12, 5.1, 5.2, 5.4, 6.2.

Так же советую обратить внимание на следующие утилиты: pdb, pylint, flake.


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

Символы и отступы


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


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


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


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


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


Допускается использование односложных имен переменных для счетчиков (i, j, k), а также если это имя фигурирует в условии задачи (N, M, K, L).


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


Если имя переменной или функции состоит из нескольких слов, то они должны разделяться символом подчеркивания или заглавными буквами. Например:
CalcSqrt – допустимо
calc_sqrt – божественно
calculate_square_root – допустимо, но нежелательно (слишком длинное имя)
vychislenie_kornya – недопустимо (используются русские имена)
f – недопустимо (непонятно назначение функции)


Обычно в качестве имён функций и переменных используются одно или несколько слов (или их сокращений) маленькими буквами с разделением символом подчёркивания.
Например, result, factorial, calc_factorial(n), calc_fact(n), iter, find_next_value(), apples_num и т.д. Для перевода слов можно использовать словари мультитран или словари Lingvo на яндексе


Имена констант записываются полностью заглавными буквами. Если имя константы состоит из нескольких слов, для их разделения используются подчеркивания. Например, EPSILON, MAX_SIZE.


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


Арифметические операции


В одной строчке записывается одна арифметическая операция. Например:



a = b
b = c


Бинарные операции разделяются пробелом. После запятой ставится пробел. Между именем функции и скобками пробел не ставится, с внутренней стороны скобок пробелы не ставятся



a = b + 2 * c
a = (b + 2) * c
print(a, b, sep = "")


Использование констант


Не допускается использование чисел в программе, значение которых неочевидно. Например, запись while i < 179 или c = c + 32 недопустима.


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


Длина каждой строки не должна превышать 79 символов, а длина строки с комментарием — 72. Переносы длинных строк могут выглядеть так:


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


Отделение операторов пробелами


Пробелы не ставятся, если они примыкают к скобкам изнутри:


Yes: spam(ham[1], {eggs: 2})
No:  spam( ham[ 1 ], { eggs: 2 } )


Пробелы не ставятся перед знаками препинания:


Yes: if x == 4: print x, y; x, y = y, x
No:  if x == 4 : print x , y ; x , y = y , x


Пробелы не ставятся перед скобкой у функций или у списков:


Yes: spam(1)
No:  spam (1)
Yes: dict['key'] = list[index]
No:  dict ['key'] = list [index]


Бинарные операции обычно отделяются одним пробелом слева и справа. Однако, если в выражении есть операции разного приоритета (например, сложение и умножение, или сложение и возведение в степень), то пробелы у операции с бОльшим приоритетом могут быть пропущены. В любом случае количество пробелов слева и справа от оператора должно быть одинаковым.


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)