Это старая версия Информатика/Архив/2019/9Д/ПравилаНаписанияПрограмм за 21.09.2019 21:33 под редакцией IlyaRayko.

Просмотр кода страницы Правила Написания Программ страница

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

Для того, чтобы комментарии на русском языке были точно читаемыми, добавьте в начало кода следующую строку:
%%(hl python)
# -*- coding: utf-8 -*-
%%


=== Правила ===
Правила и рекомендации нужно применять в порядке следования: чем раньше идёт правило, тем оно важнее
  1. ((https://ru.wikipedia.org/wiki/Бритва_Оккама Бритва Оккама))
  1. Здравый смысл при именовании сущностей: имя должны быть говорящими, но не слишком длинными
  1. PEP20. The Zen of Python (Дзен Питона). Если Вы программируете как-то иначе, то скорее всего Вы программируете не на Python. ((https://www.python.org/dev/peps/pep-0020/ Оригинал)) и ((https://tyapk.ru/blog/post/the-zen-of-python перевод)).
  1. PEP8. Style Guide for Python Code (Руководство по стилю кода на Python). Ejudge автоматически проверяет сдаваемые   код на соответствие с этим руководством. Для автоматической проверки можно использовать утилиту ##pycodestyle## (иногда она распространяется под старым именем ##pep8##). Ejudge запускает её так:  %%
  pycodestyle.py --show-source  --show-pep8 --select=E,W
  %%  ((https://www.python.org/dev/peps/pep-0008/ Оригинал)) и ((https://pythonworld.ru/osnovy/pep-8-rukovodstvo-po-napisaniyu-koda-na-python.html неплохой перевод)).
  1. Docstrings и аннотации должны присутствовать. Аннотации можно проверять статическим анализатором, например ((https://github.com/python/mypy mypy)).
  1. Для общего развития правила оформления программ в соседних классах ((https://server.179.ru/wiki/?page=DMA_Fr_F_Bl_2d_N эти)) и ((https://server.179.ru/wiki/?page=d_WZ_Ck_F7_1g_84_6 эти)).
  1. ((https://www.gnu.org/prep/standards/standards.html Правила написания кода проекта GNU.)) Большой сложный документ, охватывающий почти все возможные и невозможные случаи. Основной минус: они написаны для C/C++, поэтому некоторые технические детали к нам не относятся. Стоит обратить внимание на разделы ((https://www.gnu.org/prep/standards/standards.html#Semantics 4.2)), ((https://www.gnu.org/prep/standards/standards.html#Errors 4.4)), ((https://www.gnu.org/prep/standards/standards.html#Memory-Usage 4.11)), ((https://www.gnu.org/prep/standards/standards.html#File-Usage 4.12)), ((https://www.gnu.org/prep/standards/standards.html#Formatting 5.1)), ((https://www.gnu.org/prep/standards/standards.html#Comments 5.2)), ((https://www.gnu.org/prep/standards/standards.html#Names 5.4)), ((https://www.gnu.org/prep/standards/standards.html#Doc-Strings-and-Manuals 6.2)).

Так же советую обратить внимание на следующие утилиты: ((https://docs.python.org/3.5/library/pdb.html pdb)), ((https://www.pylint.org/ pylint)), ((http://flake8.pycqa.org/en/latest/ flake)).

===Немного про аннотации===
Для написания аннотаций бывает полезен модуль ##((https://docs.python.org/3/library/typing.html typing))##. Он может много чего, но отдельно стоит выделить:
1. Типы для контейнеров. Например правильное определение функции поиска среднего в списке целых числе такое:
%%(hl python)
def average(A: List[int]) -> float:
    """Return average value of A."""
    return sum(A) / len(A)
%%
1. Тип ##Any##. Им не стоит злоупотреблять, но многие вещи без него сделать нельзя. Например функция сортировки определяется как-то так:
%%(hl python)
def Sort(A: List[Any]) -> List[Any]:
    """Return sorted version of A."""
    return sorted(A)
%%
%%