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

Для того, чтобы комментарии на русском языке были точно читаемыми, добавьте в начало кода следующую строку:
%%(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 --max-line-length=102 --show-source --show-pep8 --ignore=W503 --ignore=W292
  %% ((https://www.python.org/dev/peps/pep-0008/ Оригинал)) и ((https://pythonworld.ru/osnovy/pep-8-rukovodstvo-po-napisaniyu-koda-na-python.html неплохой перевод)). Во многие IDE встроены средства автоматического форматирования. Например, ((https://github.com/tell-k/vim-autopep8 плагин для vim)).
  1. Docstrings и аннотации должны присутствовать. Если хочется разобраться, то имеет смысл почитать PEP в следующем порядке: 483, 3107, 484, 526. Аннотации можно проверять статическим анализатором, например ((https://github.com/python/mypy mypy)). Ejudge запускает ##mypy## так: %%
  mypy --warn-unused-configs --disallow-subclassing-any --disallow-any-generics --disallow-untyped-calls --disallow-untyped-defs\
         --disallow-incomplete-defs --check-untyped-defs --disallow-untyped-decorators --no-implicit-optional --warn-redundant-casts --warn-unused-ignores\
         --no-implicit-reexport --warn-no-return --warn-unreachable --allow-redefinition\
         --no-incremental --show-error-context --show-column-numbers --show-error-codes
  %%
  При этом для самостоятельной проверки рекомендуется использовать утилиту ##dmypy## (входит в стандартную поставку) и не использовать ключ ##--no-incremental##
  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)
from typing import List

def average(A: List[int]) -> float:
    """Return average value of A."""
    return sum(A) / len(A)
%%
2. Тип ##Any##. Им не стоит злоупотреблять, но многие вещи без него сделать нельзя. Например функция сортировки определяется как-то так:
%%(hl python)
from typing import List, Any

def Sort(A: List[Any]) -> List[Any]:
    """Return sorted version of A."""
    return sorted(A)
%%
3. Иногда нужны аннотации к данным не только в объявлениях функций. Например, считывание 100 построчно введённых целых чисел стоит оформлять так:
%%(hl python)
from typing import List

arr = [] # type: List[int]
for i in range(100):
    arr.append(int(input()))
%%

----
адрес оригинала: ((/Информатика/Архив/2019/9Д/ПравилаНаписанияПрограмм))