04.01 Стиль программирования, комментарии и строки документации
- Про стиль оформления в частности, и вообще дисциплину программирования
Установка и использование flake8
Настройка .flake8 (в частности, длины строк)
Пользуясь документацией разрешить from math import * и последующее использование sin()
Установка и использование pydocstyle
Найти документацию и настроить config так, чтобы pydocstyle не ругался на отсутствие точки в конце и вот это своё «First line should be in imperative mood» не писал
- Про пакеты (введение)
Пакет — это каталог с .py-файлом (вложенные каталоги — подпакеты вида пакет.подпакет)
Если в нём есть __init__.py, он выполняется при import-е
(есть ещё костыли для import *, но подождут до лекции)
Если в нём есть __main__.py, он выполняется при python3 -m пакет
Если нужно импортировать из «соседнего» подпакета:
from . import сосед
from .сосед import символ_соседа
from .. import сосед_этажом_ниже
from ..сосед_этажом_ниже import символ
- … и т. д.
создать пакет basepkg с двумя подпакетами: core, lib (подпакеты — это подкаталоги)
В lib содержится единственная функция output(), полностью совпадающая с print()
Подпакет core можно запускать с помощью python3 -m basepkg.core, и он выводит собственную строку документации при помощи lib.output().
Подсказка: __doc__
- Общая подсказка:
0 └── basepkg ├── core │ └── __main__.py └── lib └── __init__.py
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
ВНИМАНИЕ - упражненька нужна, т.к. в 2024 г. готовые упражненьки закончились за 40 минут до конца занятия.
Д/З
Задача_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: 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 к содержимому пакетов
- Разрешается настраивать ☺