Skip to content

Latest commit

 

History

History
91 lines (63 loc) · 10.2 KB

grading_criteria.md

File metadata and controls

91 lines (63 loc) · 10.2 KB

Критерии оценивания

Максимальный балл за каждое задание — 10. Правильность решения проверяется закрытыми тестами.

Условия принятия работы

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

  • код проходит проверки ruff и MyPy (запустить их можно локально);
  • работа сдана до дедлайна.

Если хотя бы одно условие не выполнено, работа не принимается и оценивается в 0 баллов.

Как считается балл за правильность

Задание состоит из модулей, и у каждого модуля есть свой вес. Балл за правильность считается в два шага:

  1. Для каждого модуля вычисляется доля пройденных тестов этого модуля от общего числа его тестов. Она умножается на 10 и округляется до двух знаков после запятой.
  2. Балл за правильность — взвешенная сумма баллов за модули.
балл_модуля = round(10 · пройденные_тесты_модуля / все_тесты_модуля, 2)
балл_за_правильность = Σ(вес_модуля · балл_модуля) / Σ(вес_модуля)

Дополнительные правила:

  • Нереализованный функционал. Тесты на функционал, который не реализован (заглушка, pass, NotImplementedError), считаются проваленными. Дополнительного штрафа за нереализованное нет.
  • Ошибки выполнения. Тест, в котором возникло необработанное исключение, считается проваленным.
  • Зависание. У каждого теста есть ограничение по времени выполнения. Если решение не укладывается в него (например, из-за бесконечного цикла), тест считается проваленным.

Штрафы за оформление

Кроме правильности, оценивается качество кода. За нарушения ниже из балла за правильность вычитаются штрафы. Каждое нарушение штрафуется один раз, сколько бы раз оно ни встретилось в работе.

У каждого нарушения есть уникальный код: S — серьёзные, M — средние, T — типовые. При проверке преподаватель указывает в комментарии к работе только коды (например, S1, M2, T1), а расшифровку и штраф можно найти в таблицах ниже.

Серьёзные нарушения (−1 балл за каждое)

Код Нарушение Что имеется в виду
S1 Копипаста Вместо вынесения повторяющейся логики в функцию, метод или цикл один и тот же (или почти тот же) код скопирован несколько раз. Мешает расширяемости: любое изменение приходится вносить во все копии
S2 Слишком длинные функции Функция делает много разных вещей одновременно (вычисления, проверки, преобразования, форматирование в одном месте) и не читается целиком. Ориентир: более 30–40 строк или несколько несвязанных обязанностей. Такой код тяжело читать и поддерживать
S3 Магические значения Числа и строки с неочевидным смыслом прописаны прямо в коде, а не вынесены в именованные константы. Как и копипаста, мешает расширяемости: значение приходится искать и менять по всему коду
S4 Слишком широкий перехват исключений Голый except: или except Exception: без необходимости; молча проглоченные ошибки (except ...: pass). Так можно пропустить что-то важное
S5 Изменение входных данных Функция неожиданно изменяет переданные ей аргументы, хотя из названия и описания это не следует. Неожиданное поведение, источник серьёзных ошибок

Средние нарушения (−0.5 балла за каждое)

Код Нарушение Что имеется в виду
M1 Большая вложенность Более трёх уровней вложенности (if, for, while, try, with) внутри одной функции. Лечится ранним возвратом (return, continue) и выносом логики в отдельные функции
M2 Неинформативные имена Имена вроде a, tmp, data2, x1, а также имена, не отражающие суть, или не соответствующие PEP 8 (например, camelCase для функций и переменных)
M3 Избыточные глобальные переменные Изменяемое глобальное состояние там, где достаточно параметров, возвращаемых значений или атрибутов класса
M4 Мёртвый код Код, который нигде не используется: неиспользуемые функции, классы, переменные, константы, импорты, недостижимые ветки. Сюда же относятся крупные куски закомментированного кода «на будущее» и оставленный отладочный print. Затрудняет чтение, но на работу программы не влияет

Типовые нарушения хорошего тона (−0.25 балла за каждое)

Код Нарушение
T1 else или elif после return, raise, continue или break
T2 Явное приведение к bool в условиях (if bool(x):) и сравнение с True / False (if x == True:)
T3 Сравнение с синглтонами и членами enum'ов через == / != вместо is / is not
T4 Неправильная проверка коллекции на пустоту: через len(x) == 0 или через сравнение с литералом пустой коллекции (string == "", dict_ == {}, items == []) вместо if not x
T5 Обход через for i in range(len(items)), когда индекс не нужен (вместо for item in items или enumerate)
T6 if cond: return True else: return False вместо return cond
T7 Изменяемое значение по умолчанию у аргумента (def f(x=[]))
T8 Ручная конкатенация строк вместо f-строк
T9 Избыточные комментарии, пересказывающие очевидный код
T10 Транслитерация в именах переменных (spisok, summa, chislo вместо items, total, number)

Штраф за списывание

Если работа подозревается в списывании, студент получает −5 баллов. Эти баллы не вычитаются из оценки за правильность, а заменяют итоговую оценку: итоговой оценкой становится −5, независимо от результата тестов.

Студент может оспорить этот балл на занятии, доказав, что не списывал, а написал код самостоятельно (например, объяснив решение и ответив на вопросы по нему). Если подозрение снимается, работа оценивается по обычным критериям.

Итоговая оценка

если есть подозрение в списывании:
    итоговая_оценка = −5
иначе:
    итоговая_оценка = max(0, балл_за_правильность − штрафы_за_оформление)

Итоговая оценка за домашнее задание округляется до ближайшего целого по правилам математики: дробная часть от 0.5 и выше округляется вверх, меньше 0.5 — вниз (например, 7.5 → 8, 7.4 → 7).

Как оспорить оценку

Если вы не согласны с оценкой, напишите преподавателю. Укажите, с каким блоком или с какой частью критериев вы не согласны, и приведите аргументы. Оценка пересматривается по тем же критериям, которые описаны выше.