04.01 Стиль программирования, комментарии и строки документации

  1. Про стиль оформления в частности, и вообще дисциплину программирования
    • (повторение) Зачем нужно
    • Соблюдение дисциплины оформления VS переформатирование

      • Недостаток переформатирования — несоответствие с личными привычками (особенно в случае «тяжёлых» форматтеров типа yapf и black)

      • Альтернатива — autopep8, исправление только PEP8-несовместимостей

  2. Установка и использование flake8

    • {OK} Настройка .flake8 (в частности, длины строк)

    • {i} Пользуясь документацией разрешить from math import * и последующее использование sin()

  3. {OK} Установка и использование pydocstyle

    • {i} Найти документацию и настроить config так, чтобы pydocstyle не ругался на отсутствие точки в конце и вот это своё «First line should be in imperative mood» не писал

  4. Про пакеты (введение)
    • Пакет — это каталог с .py-файлом (вложенные каталоги — подпакеты вида пакет.подпакет)

      • {OK} Если в нём есть __init__.py, он выполняется при import-е

        • (есть ещё костыли для import *, но подождут до лекции)

      • {OK} Если в нём есть __main__.py, он выполняется при python3 -m пакет

      • {OK} Если нужно импортировать из «соседнего» подпакета:

        • from . import сосед

        • from .сосед import символ_соседа

        • from .. import сосед_этажом_ниже

        • from ..сосед_этажом_ниже import символ

        • … и т. д.
    • {i} создать пакет basepkg с двумя подпакетами: core, lib (подпакеты — это подкаталоги)

      • В lib содержится единственная функция output(), полностью совпадающая с print()

      • Подпакет core можно запускать с помощью python3 -m basepkg.core, и он выводит собственную строку документации при помощи lib.output().

        • Подсказка: __doc__

      • Общая подсказка:
        0
        └── basepkg
            ├── core
            │   └── __main__.py
            └── lib
                └── __init__.py
  5. {OK} (если успеем): потыкать в yapf и black

  6. FIXME: упражненька на pre-commit hook, например с форматировщиком yapf. В 2024 г. взлетело не сразу, и была тонкость с невызовом hook-а без git add, а также тонкость с тем, выводить git diff обработанный или не обработанный yapf-ом код.

    • $ cat .git/hooks/pre-commit           
      #!/bin/sh -e
      for F in `git --no-pager diff --cached --name-only '*.py'`; do
        black --no-color -q $F
        git add $F
      done
  7. ВНИМАНИЕ - упражненька нужна, т.к. в 2024 г. готовые упражненьки закончились за 40 минут до конца занятия.

Д/З

  1. <!> Задача_1: MUD messaging

    • Скопируйте решение Задачи_1 с предыдущего занятия. Сделайте коммит. Работайте на ветке work.

    • Задайтесь вопросом: если MUD теперь многопользовательский, как пользователи (приключенцы) будут кооперироваться, чтобы вынести особо крутого монстра?
      • Спойлер: нужен чат
    • Реализуйте команду для передачи сообщения всем игрокам
      • Синтаксис: sayall <строка>, где <строка> - либо одно слово (без пробельных символов), либо строка в кавычках

      • Примеры:
        • sayall PREVED

        • sayall "Let's attack dragon at 5 9"

      • Сервер транслирует строку всем с указанием имени пользователя-источника. Пример: kobold702: Let's attack dragon at 5 9

  2. <!> Задача_2: MUDуляризация, применение flake8 и pydocstyle

    • Скопируйте решение Задачи_1. Сделайте коммит. Работайте на ветке work.

    • Оформите MUD в виде пакета с минимум двумя подпакетами: клиент (client), сервер (server); возможно, понадобится ещё третий: библиотека общих классов/констант/функций (common). Вот предположительная структура всего пакета:

      mood
      ├── client
      │   ├── …
      │   └── __main__.py
      ├── common
      │   ├── __init__.py
      │   └── …
      └── server
          ├── …
          └── __main__.py
      • В силу cowsay-ориентированности, наш MUD обрёл официальное название - MOOD
    • Запуск для каждого подпакета — в __main__.py

    • Добейтесь полного отсутствия претензий со стороны flake8 и pydocstyle к содержимому пакетов

      • Разрешается настраивать ☺

LecturesCMC/PythonDevelopment2024/Prac/07_Style (last edited 2024-04-07 22:56:47 by FrBrGeorge)