Лайфхаки

Маленькие, полезные хитрости

Основы управления проектами приложений Python

10.09.2024 в 06:32

Основы управления проектами приложений Python

Начнём с самого главного - создания нового проекта ( File → New Project ).

На вкладке слева можно выбрать на чём будет основан ваш проект. Я покажу пример создания проектаDjango(далее джанго), ноPure Pythonне будет сильно отличаться.

    В полеLocationвыбираем директорию, в которой создадим наш проект. После выбора директории в поле прописываем \название_проекта - это и будет папка нашего проекта.

    Выбор между новой виртуальной средой (New enviroment using) и уже существующей (Previosly configured interpreter)
    а) Если вы выбираете уже существующую виртуальную среду, то нужно указать путь до файла python.exe в папке ../venv/Scripts/python.exe (для Linux ../venv/bin/python )
    б) Но как правило создаётся новая виртуальная среда. В полеLocationможно выбрать местонахождение папки venv . По умолчанию папка venv расположится внутри папки проекта. Если необходимо создать папку с именем отличным от venv , то в полеLocationсотрите venv и впишите название папки.
    ПунктInherit global site-packagesпозволяет включить в нашу виртуальную среду все библиотеки установленные в глобальной среде.
    Make available to all projectsотвечает за видимость созданной виртуальной среды для других проектов. Если вам нужна одна виртуальная среда сразу на несколько проектов, то стоит выбрать этот пункт.

    Если у вас отсутствует путь вBase interpreter, то нужно добавить python в PATH.

    Тут уже начинаются настройки для джанго. В полеTempate languagesидёт выбор языка для html шаблонов. Можно оставить стандартный Django или при необходимости выбрать Jinja2.

    ПолеTemplates folderотвечает за название папки с шаблонами. Без особой необходимости менять название этой папки не стоит.

    ВApplication nameможно указать имя нашего первого приложения, которое мы хотим создать.

    ПунктEnable Django adminотвечает за работу стандартной админ. панели джанго. Если вам не нужна полностью своя админ. панель, то смело ставим тут галочку. Функционала стандартной админ. панели, как правило, достаточно.

Связанные вопросы и ответы:

Вопрос 1: Что такое управление проектами приложений Python

Ответ: Управление проектами приложений Python - это процесс планирования, организации, мониторинга и контроля разработки программного обеспечения на языке Python. Этот процесс включает в себя определение целей проекта, составление плана работ, выбор методологии разработки, составление команды разработчиков, управление рисками и контроль качества.

Вопрос 2: Какие методы разработки программного обеспечения можно использовать при управлении проектами приложений Python

Ответ: Существует множество методологий разработки программного обеспечения, которые можно использовать при управлении проектами приложений Python. Некоторые из них включают в себя Agile, Scrum, Kanban, Waterfall и Lean. Выбор методологии зависит от конкретных требований проекта и предпочтений команды разработчиков.

Вопрос 3: Как можно организовать работу команды разработчиков при управлении проектами приложений Python

Ответ: Организация работы команды разработчиков при управлении проектами приложений Python зависит от выбранной методологии разработки. Например, при использовании методологии Scrum, команда разработчиков делится на роли, такие как Scrum Master, Product Owner и Development Team. Команда проводит ежедневные совещания, чтобы обсудить прогресс работы и проблемы, которые возникли.

Вопрос 4: Как можно контролировать качество при управлении проектами приложений Python

Ответ: Контроль качества при управлении проектами приложений Python включает в себя проведение тестирования и верификации продукта. Это может быть сделано с помощью автоматизированных тестов, таких как单元-тесты и интеграционные тесты, а также ручного тестирования. Команда разработчиков должна также следить за отчетами о проблемах и исправлять их в кратчайшие сроки.

Вопрос 5: Как можно управлять рисками при управлении проектами приложений Python

Ответ: Управление рисками при управлении проектами приложений Python включает в себя идентификацию потенциальных рисков и разработки планов по их устранению. Команда разработчиков должна также проводить мониторинг рисков и реагировать на изменения в их уровне.

Вопрос 6: Как можно оценить успешность проекта при управлении проектами приложений Python

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

Вопрос 7: Как можно оптимизировать процесс управления проектами приложений Python

Ответ: Оптимизация процесса управления проектами приложений Python может быть достигнута с помощью использования различных инструментов и технологий. Например, использование систем управления версиями, таких как Git, может помочь в управлении кодом и предотвратить конфликты. Использование инструментов для мониторинга производительности и отслеживания ошибок, таких как New Relic и Sentry, может помочь в выявлении проблем и их устранении.

Что такое управление проектами приложений Python

Сначала обратим внимание на структуру директорий проекта, на именование файлов и организацию модулей.

Рекомендую держать все файлы модулей в директории src, а тесты — в поддиректорииtests этой директории:

├── src │   ├── /* │   │    ├── __init__.py │   │    └── many_files.py │   │ │   └── tests/* │        └── many_tests.py │ ├── .gitignore ├── pyproject.toml └── README.md

Здесь  — это главный модуль проекта. Если вы не знаете точно — какой именно модуль у вас главный — подумайте о том, что пользователи проекта будут устанавливать командой pip install, и о том, как, по вашему мнению, должна выглядеть командаimport для вашего модуля.

Часто имя главного модуля совпадает с именем всего проекта. Но это — не некое жёсткое правило.

Аргументы в пользу директории src

Я видел множество проектов, устроенных по-другому.

Например, в проекте может отсутствовать директория src, а все модули будут просто лежать в его корневой директории:

non_recommended_project ├── /* │     ├── __init__.py │     └── many_files.py │ ├── .gitignore │ ├── tests/* │    └── many_tests.py │ ├── pyproject.toml │ ├── /* │     ├── __init__.py │     └── many_files.py │ └── README.md

Уныло смотрится проект, в структуре которого нет никакого порядка из-за того, что его папки и файлы просто расположены по алфавиту, в соответствии с правилами сортировки объектов в IDE.

Главная причина, по которой рекомендуется пользоваться папкой src, заключается в том, чтобы активный код проекта был бы собран в одной директории, а настройки, параметры CI/CD, метаданные проекта находились бы за пределами этой директории.

Единственный минус такого подхода заключается в том, что, без дополнительных усилий, не получится воспользоваться в своём коде командой вида import module_a. Для этого потребуется кое-что сделать. Ниже мы поговорим о том, как решить эту проблему.

Какие навыки необходимы для управления проектами приложений Python

При работе на реальном проекте программисту Python недостаточно иметь необходимые технические навыки и уметь решать поставленные задачи. Не менее важны различные социальные и личностные качества:

— умение коммуницировать с людьми;

— умение работать в команде;

— стремление к профессиональному росту;

— повышенное чувство ответственности;

— умение управлять своим рабочим временем.

Все это — базовые soft skills , необходимые почти на любой должности в сфере IT.

Если речь идет о кандидате без опыта, претендующего на позицию джуниора, то тут можно сделать акцент на следующих навыках:

— умение быстро осваивать много нового материала, способность учиться;

— умение вникать в суть поставленных задач;

— умение быстро схватывать, что от тебя хотят;

— отсутствие страха перед рутинными задачами.

На собеседовании могут спросить об отношении соискателя к рутинным задачам , и это неспроста, т. к. работа нередко включает в себя монотонные процессы. Задавая этот вопрос, работодатель просто желает убедиться, что на вас стоит тратить время, то есть вы не заскучаете через 2 месяца и не сбежите, т. к. «неинтересно». Идеальный ответ — что-то вроде: «Сейчас такие задачи для меня — это реальная возможность получить опыт и отработать свои навыки. В перспективе этот опыт позволит мне справляться с более сложными задачами».

Также могут спросить, по какой причине вы желаете работать именно в этой компании, именно на этом проекте, именно на этой должности. Чтобы высказать искреннюю заинтересованность и произвести наиболее благоприятное впечатление, желательно заранее изучить:

— будущие задачи, проекты, продукты;

— особенности компании, ее корпоративную культуру;

— отзывы сотрудников;

— условия работы и т. п.

Как организовать работу над проектом приложений Python

Большинство разработчиков, особенно новичков, не уделяют должного внимания зависимостям проекта. Что такое управление зависимостями в первую очередь?

Программное обеспечение, которое вы разрабатываете, может зависеть от пакетов, созданных другими разработчиками. Они, в свою очередь, могут зависеть от нескольких разных пакетов. Этот модульный подход помогает быстро создавать программные продукты, не изобретая все время велосипед.

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

Надежная система управления зависимостями должна уметь различать эти наборы.

Разработчики Python используют виртуальную (или conda) среду для установки зависимостей проекта. Но Virtualenv не является инструментом управления зависимостями. У него нет описанных выше преимуществ. Это только помогает изолировать среду проекта от вашей системы.

Poetry - идеальный инструмент управления зависимостями для проектов Python. Это позволяет вам,

  • отдельные зависимости разработки и производства;
  • установить версию Python для каждого проекта отдельно;
  • создавать точки входа в ваше программное обеспечение;
  • помогает упаковать и опубликовать его в таких репозиториях, как PyPI.

Поэзия не заменяет Virtualenv. Он создает и управляет виртуальным окружением с помощью удобных служебных команд.

Если вам нравится эта идея, я опубликовал полное руководство о том, как можно использовать Poetry для эффективного управления зависимостями проекта .

Как оценить успех проекта приложений Python


Можете порадоваться — вам не придётся ничего писать самостоятельно. В Python уже есть—cProfileиprofile. Они выполняют одну задачу, ноcProfileнаписан на C, аprofile— на чистом Python, но в нашем случае разницы нет. Можем использовать их и в исходном виде, однако мы сильно упростим себе жизнь, если воспользуемся несколькими внешними инструментами.Нам необходим быстрый и удобный способ профилирования части кода (например, функции) и сохранения результата в файл. Модуль под названиемprofilehooksпредоставляет, которым мы можем обернуть интересующую нас функцию:

from profilehooks import profile # stdout=False -> не выводить ничего в терминал # filename -> путь к файлу с результатами профилирования @profile(stdout=False, filename='baseline.prof') def baseline(): …

Его можно установить простой командойpip install profilehooks.И нам нужно визуализировать этот файл удобным для человека образом. Для этого я пользуюсь двумя инструментами.

▍ SnakeViz — простой и быстрый

— это работающий в браузере интерактивный визуализатор результатов профилирования Python. Его невероятно легко установить (pip install snakeviz) и использовать (snakeviz ). Давайте взглянем на результаты профилирования нашей функцииbaseline. Интерактивные результаты Snakeviz — графики icicle (слева) и sunburst (правый, менее читаемый). Можно наводить мышью и щёлкать на любую функцию, чтобы просматривать подробности. Сверху вниз идёт вложенная иерархия вызовов, а длина линии — это относительное время, потраченное кодом на их исполнение

Кроме того, Snakeviz демонстрирует интерактивную таблицу со статистикой времени исполнения функций Мы видим, что больше всего времени исполнения тратится внутри функцииfindall, то есть на выполнение поиска регулярными выражениями. Значит, если мы хотим ускорить код, то нужно сосредоточиться на ускорении этой функции, так как узким местом является она, а не другие части кода.Давайте проверим результаты во втором инструменте.

▍ gprof2dot — читаемый и гибкий

предоставляет более читаемую визуализацию в виде блок-схемы, выполняет сохранение в файлы изображений, поэтому в нём легко делиться результатами (а по необходимости и автоматизировать это). Однако он не интерактивен и требует установки в систему.Для установки gprof2dot достаточно выполнить командуpip install gprof2dot.Для генерации выходного изображения с результатом профилирования нужно использовать следующую команду:

python -m gprof2dot -f pstats dot, а затем генерируем изображение — визуализацию этого графа. Командаdotподдерживает различные форматы вывода, в том числе.jpgи, а результатытакже можно гибко настраивать.Давайте посмотрим, как они выглядят.Теперь картина выглядит гораздо более читаемой, граф показывает нам, что поиск регулярными выражениями занимает 88% от общего времени исполнения, поэтому нам нужно сделать его быстрее.Если у вас нет доступа к Graphviz (команда), то можно использовать(), а также простой скрипт на Python для генерации результатов.

Какие инструменты и технологии используются для управления проектами приложений Python

Прежде чем погрузиться в архитектуру, я хотел бы ответить на несколько часто задаваемых вопросов:

    В чем преимущества указания типов в python?

    Каковы причины разделения приложения на слои?

    Каковы преимущества использования ООП?

    Каковы недостатки использования глобальных переменных или синглтонов?

Не стесняйтесь пропустить теоретические разделы, если вы уже знаете ответы, и переходите непосредственно к разделу «Создание программы».

Всегда указывайте типы

Аннотация типов значительно улучшает код, повышая его ясность, надежность и ремонтопригодность:

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

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

    Повышение качества кода : Использование подсказок типов способствует улучшению дизайна и архитектуры, способствуя продуманному планированию и реализации структур данных и интерфейсов.

    Улучшенная поддержка инструментов : Такие инструменты, как mypy , используют аннотации типов для статической проверки типов, выявляя потенциальные ошибки до начала выполнения, тем самым упрощая процесс разработки и тестирования.

    Поддержка современных библиотек : FastAPI, Pydantic и другие библиотеки используют аннотации типов для автоматизации валидации данных, генерации документации и уменьшения дублирования кода.

    Преимущества типизированных классов данных перед простыми структурами данных : Типизированные классы данных улучшают читаемость, работу со структурированными данными и безопасность типов по сравнению с массивами и кортежами. Они используют атрибуты вместо строковых ключей, что минимизирует ошибки из-за опечаток и улучшает автодополнение кода. Датаклассы также обеспечивают четкое определение структур данных, поддерживают значения по умолчанию, упрощают сопровождение и отладку кода.

Как обеспечить качество кода при разработке приложений Python

В любом программном проекте код является одним из самых важных активов. Окончательный код должен быть чистым и простым для понимания, чтобы облегчить его поддержку.

Повторное использование частей кода, модульность и объектно-ориентированный подход — лишь некоторые из методов, используемых для создания высококачественного кода. В этом разделе я опишу несколько отличительных черт высококачественного кода.

На первый взгляд, эти черты могут показаться неважными, но они влияют на то, насколько эффективно разработчики смогут работать с исходным кодом вашего проекта. Давайте начнем!

1. Код: программное обеспечение, запущенное на рабочих серверах для обработки данных пользователей и целевой аудитории. Обратите внимание, что есть отличия от кода , который отвечает ожиданиям по надежности, эффективности и т. д. для продакшена. В идеале весь код должен соответствовать этим ожиданиям, но это не всегда так.

2. Ясность: читабельно, просто и лаконично. Характеристика качественного кода, которая имеет решающее значение для совместной работы и удобства сопровождения при разработке программного обеспечения. Чистый код является очень важной характеристикой высококачественного продакшена. Написание чистого кода дает нам:

  • Узконаправленный код: Каждая функция, класс или модуль должны делать одну вещь и делать это хорошо.
  • Легко читаемый код: По словам Грэди Буча, автора книги «Объектно-ориентированный анализ и проектирование с примерами приложений», чистый код читается как хорошо написанная проза.
  • Простота отладки кода: Чистый код можно легко отлаживать и исправлять ошибки, поскольку он легко читаем и выполняем.
  • Простота сопровождения: Другие разработчики могут легко читать и улучшать его.

3. Модульный код: логически разбит на функции и модули. Кроме того, важной характеристикой качественного кода является то, что он делает ваш код более организованным, эффективным и пригодным для повторного использования. Модули позволяют повторно использовать код, инкапсулируя его в файлы, которые можно импортировать в другие файлы.

4. Рефакторинг: реструктуризация вашего кода для улучшения внутренней структуры без изменения внешней функциональности. Это дает вам возможность очистить и разбить на модули вашу программу после того, как она заработает. Поскольку нелегко одновременно писать чистый и работающий код, выделение времени для этого имеет важное значение для создания высококачественного кода. Несмотря на первоначальные затраты времени и усилий, это действительно окупается, ускоряя время разработки в долгосрочной перспективе.

Так что совершенно нормально сначала написать работающий код, а затем провести рефакторинг и получить чистый код. Вы становитесь гораздо более квалифицированным программистом, если постоянно стремитесь улучшить свой код. Чем больше вы рефакторите, тем легче будет структурировать и писать хороший код с первого раза.

Как собирать и анализировать отзывы пользователей приложений Python

Surprise (Simple Python RecommendatIon System Engine) - это Python-библиотека, разработанная для создания и оценки рекомендательных систем. Она предоставляет простой и эффективный способ реализовать различные алгоритмы рекомендации, позволяя разработчикам быстро и легко создавать персонализированные рекомендательные системы.

Установка и настройка

Установка Surprise осуществляется через Python Package Index (PyPI) с помощью pip. Для начала установки выполните следующую команду:

pip install scikit-surprise

После успешной установки, вы готовы начать работу с библиотекой Surprise. Важно отметить, что Surprise требует наличия библиотекиscipy, так что убедитесь, что она установлена в вашем окружении.

Основные функциональности и классы Surprise

Surprise предоставляет множество классов и функций для создания, обучения и оценки рекомендательных систем. Давайте рассмотрим основные компоненты библиотеки:

    Dataset : КлассDatasetпозволяет загружать и предобрабатывать данные для рекомендательной системы. Вы можете использовать встроенные датасеты или загрузить собственные данные в формате, поддерживаемом Surprise.

from surprise import Dataset # Загрузка встроенного датасета data = Dataset.load_builtin('ml-100k') # Загрузка данных из файла data = Dataset.load_from_file('custom_data.csv', reader=reader)

    Reader : КлассReaderиспользуется для определения того, как данные хранятся в файле. Вы можете настроить параметры, такие как разделитель столбцов, минимальное и максимальное значение рейтинга и др.

from surprise import Reader reader = Reader(line_format='user item rating timestamp', sep='\t', rating_scale=(1, 5))

    Модели алгоритмов : Surprise предоставляет множество алгоритмов для создания рекомендательных систем, таких как SVD, K-Nearest Neighbors (KNN), и другие. Вы можете выбрать подходящий алгоритм и настроить его параметры.

from surprise import SVD # Создание модели SVD model = SVD(n_factors=100, n_epochs=20, lr_all=0.005, reg_all=0.02) # Обучение модели на данных trainset = data.build_full_trainset() model.fit(trainset)

    Метрики оценки : Surprise предоставляет различные метрики для оценки производительности моделей, такие как Mean Absolute Error (MAE), Root Mean Square Error (RMSE), Precision, Recall и другие.

from surprise import accuracy # Получение прогнозов модели testset = trainset.build_testset() predictions = model.test(testset) # Расчет MAE и RMSE mae = accuracy.mae(predictions) rmse = accuracy.rmse(predictions)

    Кросс-валидация : Вы можете использовать кросс-валидацию для оценки производительности модели на разных наборах данных.

from surprise.model_selection import cross_validate results = cross_validate(model, data, measures=, cv=5, verbose=True)

Это всего лишь небольшой обзор базовых функций и классов библиотеки Surprise. Она предоставляет множество возможностей для создания и настройки рекомендательных систем, а также для их оценки.

Как оптимизировать процесс разработки приложений Python


Ускоритель оказывается особенно эффективен, когда приложение загружено достаточным объёмом работы, чтобы её разгрузка оправдала необходимые для этого затраты. Первым шагом мы компилируем выбранные вычисления (фрагмент программы), чтобы их можно было разгрузить на другие устройства. Продолжая предыдущий пример, мы используем расширения Numba () для обозначения разгружаемого фрагмента программы (подробнее читайте в).

@dppy.kernel def add(a, b, c): i = dppy.get_global_id(0) c = a + b

Фрагмент программы компилируется и распараллеливается так, будто ранее он использовал@njitдля подготовки к выполнению на CPU, только на сей раз он подготавливается к переносу на устройство. Код компилируется в промежуточный язык (), который среда выполнения в установленный для его запуска момент сопоставляет с устройством. Это универсальное решение, которое позволяет переносить вычисления на ускоритель любого вендора.Аргументами для фрагмента программы могут выступать массивы NumPy или массивы унифицированной разделяемой памяти (USM) (тип массивов, явно помещаемых в унифицированную разделяемую память), в зависимости от того, что больше соответствует нашим потребностям. Этот выбор повлияет на настройку данных и активацию фрагментов программы.Далее мы задействуем решение C++ для открытого мультивендорного и мультиархитектурного программирования под названием, используя опенсорсную библиотеку dpctl (подробнее читайте ви). Эта библиотека позволяет программам Python обращаться к устройствам SYCL, очередям и источникам памяти, а также выполнять операции с массивами/тензорами Python. Такой подход позволяет избежать изобретения новых решений, уменьшить потребность в освоении новых техник и повысить совместимость.Подключение к устройству выполняется просто:

device = dpctl.select_default_device() print("Using device …") device.print_device_info()

Дефолтное устройство можно установить с помощью переменной средыSYCL_DEVICE_FILTER, если мы хотим контролировать выбор устройства без изменения этой простой программы. Библиотека dpctl также поддерживает программное управление для анализа и выбора доступного устройства на основе свойств аппаратного обеспечения.Фрагмент программы также можно активировать (перенести и выполнить) на устройстве буквально парой строк кода:

with dpctl.device_context(device): dpar_add(a,b,c)

Использованиеdevice_contextприводит к тому, что среда выполнения создаёт все необходимые копии данных (наши данные по-прежнему находились в стандартных массивах NumPy). Кроме этого, dpctl предлагает возможность явного выделения USM-памяти для устройств и управления ею. Это особенно пригождается, когда при углублении в оптимизацию возникают сложности с поручением её обработки для стандартных массивов NumPy среде выполнения.

Как управлять командой разработчиков приложений Python

Мне необходимо реализовать небольшое приложение со своим собственным CLI, которое принимает команды: start - запустить сервер, stop - остановить сервер, statistics - вывести статистику.
Хочу добиться результата вида :

$ myserver.py start $ myserver.py statistic $ myserver.py stop

но не знаю как. Пробовал сделать через daemon A simple unix/linux daemon in Python , но не получилось собирать статистику. Может мне нужно смотреть в сторону subprocess ?
Подскажите как правильно организовать управление?