| date | 9 ноября 2023 года |
|---|---|
| author | Е.А. Роганов |
| title | Проект «Выпуклая оболочка» |
| main_version | 2 |
Необходимо написать программу, находящую выпуклую оболочку последовательно поступающих точек плоскости и вычисляющую её периметр и площадь. Решение должно быть индуктивным, что означает определение выпуклой оболочки и вычисление её характеристик сразу после поступления очередной точки с использованием методов теории индуктивных функций.
- Ключевое понятие проекта: освещённость ребра из точки
- Вспомогательные классы:
R2Point— точка на плоскостиDeq— контейнер дек (double ended queue)
- Основные классы:
Figure— «абстрактная» фигураVoid— нульугольникPoint— одноугольникSegment— двуугольникPolygon— многоугольник
- Файлы проекта:
README.md— данный файлr2point.py— реализация классаR2Pointdeq.py— реализация классаDeqconvex.py— реализация основных классовrun_convex.py— файл запускаtk_drawer.py— интерфейс к графической библиотекеrun_tk_convex.py— файл запуска с использованием графикиtests/test_r2point.py— тесты к классуR2Pointtests/test_convex.py— тесты к основным классам
Файлы run_tk_convex.py и run_tk_convex.py являются исполняемыми (они имеют
бит x), в первой строке каждого из них используется шебанг и команда env с
опцией (ключом) -S. Это обеспечивает передачу интерпретатору языка Python
опции (ключа) -B, отменяющего генерацию pyc-файлов в директории
__pycache__.
Для языка Python существуют соглашения о стиле
кода. Они являются лишь
рекомендациями (интерпретатор игнорирует их нарушение), но основную их
часть при написании программ целесообразно соблюдать. Существует простой
способ проверить соблюдение считающегося правильным
стиля записи кода с помощью утилиты (программы) pycodestyle. Утилита
yapf позволяет даже изменить код в соответствии с этими соглашениями.
Команда
pycodestyle r2point.py
позволяет, например, проверить соблюдение стиля для файла r2point.py.
С помощью очень мощной и часто используемой утилиты find проверить
корректность стиля всех файлов проекта можно так:
find . -name '*.py' -exec pycodestyle {} \;
Эта команда находит все файлы с расширением py и запускает программу
pycodestyle последовательно для каждого из них.
Уже известная нам команда (см. материал, посвящённый тестированию программ)
python -B -m pytest -p no:cacheprovider tests
запускает pytest, выполняя все начинающиеся с test методы классов,
имена которых начинаются с Test, содержащиеся во всех файлах test_*.py
директории tests.
Вот как примерно может выглядеть результат запуска этой команды:
[roganov@aorus convex]$ python -B -m pytest -p no:cacheprovider tests
============================= test session starts ==============================
platform linux -- Python 3.12.0, pytest-7.4.3, pluggy-1.3.0
rootdir: /home/roganov/convex
plugins: mock-3.12.0
collected 47 items
tests/test_convex.py .............................. [ 63%]
tests/test_r2point.py ................. [100%]
============================== 47 passed in 0.07s ==============================
Для языка Python почти стандартом проверки покрытия является библиотека
coverage. Вот как можно
её использовать:
[roganov@aorus convex]$ export PYTHONDONTWRITEBYTECODE=yes
[roganov@aorus convex]$ coverage run -m pytest -p no:cacheprovider tests && coverage report -m ; rm -f .coverage
============================= test session starts ==============================
platform linux -- Python 3.12.0, pytest-7.4.3, pluggy-1.3.0
rootdir: /home/roganov/convex
plugins: mock-3.12.0
collected 47 items
tests/test_convex.py .............................. [ 63%]
tests/test_r2point.py ................. [100%]
============================== 47 passed in 0.17s ==============================
Name Stmts Miss Cover Missing
-----------------------------------------------------
convex.py 75 8 89% 116-123
deq.py 25 7 72% 41-47
r2point.py 31 5 84% 49-53
tests/test_convex.py 81 0 100%
tests/test_r2point.py 55 0 100%
-----------------------------------------------------
TOTAL 267 20 93%
Полученный результат говорит нам о том, что не все строки тестируемых `py'-файлов проекта проверяются во время тестов. Насколько это плохо и можем ли мы «исправить» ситуацию?
Установка переменной окружения (environment)
PYTHONDONTWRITEBYTECODEзапрещает интерпретатору языка Python создаватьpyc-файлы. При запуске тестов мы добивались этого передавая интерпретатору ключ-B, ноcoverageне позволяет так поступить.
Вышеприведённая команда выполняет последовательно три действия: -
coverageзапускает тесты; - в случае их успешного завершения печатается отчётcoverage; - и удаляется файл.coverage
./run_convex.py
./run_tk_convex.py