Разработка python: Python — Википедия – 3 самых важных сферы применения Python: возможности языка

Содержание

Введение в создание веб-приложений на Python

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

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

Общие характеристики:

  • Маршрутизация URL-адресов
  • Шаблоны вывода
  • Управление базами данных
  • Управление сеансом
  • Безопасность от стандартных атак

С помощью фреймворка вы можете реализовать большинство этих функций.

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

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

Django и Flask – самые популярные веб-фреймворки. Однако ознакомиться с другими фреймворками не помешает.

Вот некоторые из них:

  • Bottle
  • Pyramid
  • Muffin
  • CherryPy
  • web2py
  • Falcon
  • Turbo2Gears


Django является наиболее часто используемым фреймворком Python. У него довольно широкий функционал, поэтому вы можете сосредоточиться на разработке веб-приложений и не думать ни о чем другом. Сайты, созданные с помощью Django, имеют дело с высоким трафиком (50 тысяч просмотров в секунду и более).

Доступ к базе данных осуществляется через объектно-реляционное преобразование: вы определяете свои модели данных в Python, и Django начинает работать с реляционными системами управления базами данных (СУБД). Однако, если вам нужно, вы можете написать свои собственные SQL-запросы в Django. Также в этом фреймворке поддерживается маршрутизация URL-адресов.

Особенности:

    • Объектно-реляционное преобразование
    • Маршрутизация URL-адресов и их представления
    • Механизм шаблонов
    • Формы
    • Идентификация
    • Права администратора
    • Интернационализация
    • Безопасность

Если вы хотите узнать о Django побольше, прочтите это.

Знаете ли вы, что такие сайты, как NASA, BitBucket и Pinterest были написаны с помощью Django?


Flask является микрофреймворком Python, который имеет модульный дизайн. Данный фреймворк предназначен для создания веб-приложений. У Flask нет определенной системы базы данных или системы ORM. Если вы хотите использовать базу данных, то вам потребуется отдельный модуль. Flask часто комбинируют с SQLAlchemy для использования баз данных.

Flask очень прост и интуитивно понятен:

from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'Hello World!'
 
if __name__ == '__main__':
    app.run()

Платформа поддерживает маршрутизацию URL-адресов, шаблоны (с Jinja2), управление сеансами и имеет некоторые фишки в области безопасности.

Особенности:

  • Маршрутизация URL-адресов и их представления
  • Механизм шаблонов
  • Управление сеансами

Если вы хотите узнать о Flask побольше, прочтите это.

Знаете ли вы, что изначально Flask был придуман как первоапрельская шутка?

Оригинал

100+ крутых проектов, созданных с помощью Python

Хотите проверить, насколько могуч Python? Мы собрали подборку проектов, созданных с помощью Python, которые докажут, что этот язык способен на многое.

  • Canto − RSS-демон и Canto Curses клиент
  • Deluge − популярный, легкий, кросс-платформенный клиент BitTorrent
  • gPodder − простой медиа-агрегатор и проигрыватель подкастов
  • Pi-Hole − приложение для блокировки интернет-трекинга
  • Planet − агрегатор каналов RSS и Atom, предназначенный для сбора сообщений из блогов и отображения их на одной странице
  • Qute Browser − vim-looked бразуер на PyQt5
  • Tribler − конфиденциальный клиент BitTorrent с поддержкой P2P-контента

  • Beets − менеджер музыкальных библиотек c поиском копий, поддержкой транскодирования и тегов, интеграцией с MusicBrainz, Discogs и другими
  • Exaile − аудиоплеер, редактор тегов и органайзер библиотеки
  • Friture − сервис для визуализации и анализа данных в режиме реального времени
  • GNU Solfege − программа для тренировки слуха музыкантов
  • MusicBrainz Picard − идентификация и маркировка аудиозаписей
  • SoundConverter − транскодер аудиофайлов на основе GNOME

  • Flowblade − программа для редактирования видео на Linux
  • OpenShot − видеоредактор для FreeBSD, Linux, macOS и Windows
  • Pitivi − видеоредактор для Linux, построенный на GStreamer

  • FreeCAD − 3D CAD Modeler и ПО для моделирования зданий с поддержкой метода конечных элементов
  • MakeHuman − программа для создания 3D-моделей гуманоидов
  • MyPaint − растровый графический редактор для художников
  • OCRopus − система анализа документов и распознавания символов
  • SK1 − многофункциональная программа для иллюстрации


Frets on Fire X − приложение с поддержкой игры на гитаре, басу, ударных и вокала
Lucas Chess − шахматный клиент для Windows
PyChess − продвинутый шахматный клиент
PySolFC − коллекция карточных игр
Unknown Horizons − 2D-симулятор стратегии про экономику и городское строительство

  • Attic − система резервного копирования с дополнительным шифрованием
  • Autokey − автоматизация рабочего стола для Linux и X11
  • Bleachbit − программа для очистки диска
  • Bup − система резервного копирования на основе git packfile
  • Excalibur − веб-интерфейс для извлечения табличных данных из PDF-файлов
  • gmvault − инструмент для резервного копирования учетных записей gmail
  • Metamorphose − программа для массового переименования файлов и папок
  • nvda − Non-Visual Desktop Access − программа для чтения с экрана для Windows
  • Ranger − консольный файловый менеджер, вдохновленный vim


Calibre − менеджер электронных книг, предназначенный для просмотра, конвертации, редактирования
CherryTree − личный блокнот, похожий на вики, с подсветкой текста и синтаксиса
Gramps − ПО для любителей генеалогии
Invenio − платформа для запуска доверенного цифрового хранилища
PyMedusa − менеджер видео-библиотеки для ТВ-шоу, с автозагрузкой
Radicale − простой CalDAV (календарь) и CardDAV (контакт) сервер
WiKID Pad − блокнот для записи мыслей
Zim Wiki − вики для ведения заметок, составления списков и черчения

100+ крутых проектов, созданных с помощью Python

  • Askbot − веб-платформа, похожая на StackOverflow, с тегами, репутацией, значками
  • Gajim − легкий клиент для обмена мгновенными сообщениями с использованием протокола XMPP
  • GlobaLeaks − веб-приложение для безопасной и анонимной рассылки оповещений
  • Mailman − веб-приложение и почтовый сервер для управления подписками и архивами
  • Mailpile − почтовый клиент с функциями шифрования и конфиденциальности
  • Modoboa − почтовый хостинг и платформа для управления с интерфейсом на основе Django. Интегрируется с Postfix и Dovecot
  • MoinMoin − собственная веб-программа Python для создания вики
  • OfflineIMAP − считыватель и синхронизатор IMAP
  • Pootle − веб-приложение для совместного перевода
  • RapidSMS − платформа для обмена текстовыми SMS-сообщениями
  • Seafile − система хранения и синхронизации файлов
  • TahoeLAFS − облачная система хранения для надежного распределенного хранения данных
  • Virtaal − графический интерфейс для выполнения перевода с поддержкой различных форматов
  • Zulip − мощный чат-сервер и веб-клиент с поддержкой потоковых диалогов

  • Anki − настольное приложение для запоминания с помощью флеш-карт
  • Mnemosyne − программа с интервальным повторением для эффективного запоминания
  • NBGrader − приложение на основе Jupyter, которое позволяет преподавателям создавать и оценивать задания
  • Open edX Platform − платформа для создания онлайн-курсов

  • ASCEND − система математического моделирования химических процессов
  • CellProfiler − интерактивное исследование данных, анализ и классификация наборов биологических изображений
  • CoCalc − совместные вычисления в облаке с поддержкой научного стека Python, SageMath, R, LaTeX, Markdown. Также имеется чат, управление курсами и другие функции
  • Dissem.in − веб-платформа, помогающая исследователям загружать свои статьи в репозитории открытого доступа
  • Mayavi − универсальный инструмент для визуализации научных данных
  • Veusz − научные 2D и 3D графики, предназначенные для создания готовых к публикации PDF или SVG-графиков

  • Abilian SBE − ПО с открытым исходным кодом, для управления бизнесом компании
  • Django-CMS − система управления контентом на основе инфраструктуры Django с контролем версий, поддержкой нескольких сайтов и многим другим
  • Ella − основанная на Django система управления контентом с упором на мировые новостные сайты и интернет-журналы
  • Mezzanine − гибкая платформа управления контентом, построенная на платформе Django
  • Plone − расширяемая система управления корпоративным контентом, основанная на Zope
  • Plumi − система управления контентом для обмена видео на основе Plone
  • Saleor − модульная e-commerce площадка на базе Django, GraphQL и ReactJS
  • Wagtail − система управления контентом, ориентированная на гибкость и удобство использования

  • ERP5 − веб-система ERP, CRM, DMS и Big Data с сотнями встроенных модулей, разработанная для масштабируемости
  • ERPNext − веб-система ERP с учетом, инвентаризацией, CRM, продажами, закупками, управлением проектами и HR. Построен на Frappe и MariaDB.
  • Odoo − ERP и CRM со множеством встроенных модулей
  • Tryton − модульная веб-ERP, предназначенная для компаний всех размеров

  • Cactus − генератор страниц с использованием шаблонов Django
  • Chert − генератор со встроенной поддержкой списков
  • Lektor − генератор статических страниц со встроенной консолью администратора
  • Nikola − настраиваемый генератор с поддержкой Markdown, reST, Jupyter и HTML
  • Pelican − генератор с поддержкой синтаксисов Markdown и reST

SCM

  • Git Cola − кросс-платформенная оболочка для GUI git
  • GNU Bazaar − распределенная и клиент-серверная система контроля версий
  • Patchwork − система отслеживания исправлений в коде
  • RhodeCode − платформа для управления исходным кодом
  • Roundup − система отслеживания проблем с интерфейсами, сетью и электронной почтой
  • ViewVC − браузерный интерфейс для CVS и контроля субверсий

Обзор кода

  • Meld − средство визуального сравнения файлов и каталогов, поддерживающее многие системы контроля версий, включая Git, Mercurial, Bazaar и Subversion
  • Review Board − инструмент для проверки кода проектов
  • Rietveld − основанный на Django инструмент для совместного анализа кода для Subversion

Ops

  • Ansible − автоматизация на основе playbook
  • Barman − удаленное резервное копирование и аварийное восстановление для PostgreSQL
  • Cobbler − установочный сервер Linux, который позволяет быстро настроить среды сетевой установки
  • fail2ban − демон для запрета хостов, которые вызывают ошибки аутентификации на серверах Linux
  • Ganeti − инструмент управления виртуальными машинами, основанный на существующих технологиях виртуализации, таких, как Xen и KVM
  • Gunicorn − разветвленный WSGI-сервер, запущенный как аналог Unicorn
  • Iris − автоматизированная система оповещения о происшествиях, разработанная и используемая в LinkedIn
  • NColony − менеджер процессов
  • OpenStack − облачная операционная система, которая управляет пулами вычислительных ресурсов, хранилищ и сетевых ресурсов в центре обработки данных
  • pgcli − интерактивный клиент PostgreSQL, выполняющий автозаполнение и подсветку синтаксиса
  • WAL-E − архивирование файлов PostgreSQL WAL и резервных копий

Безопасность

100+ крутых проектов, созданных с помощью Python

  • Cowrie − ПО для фиксирования хакерских атак и выявления их источников
  • MITMproxy − интерактивный протокол TLS с возможностью перехвата HTTP-прокси для тестеров на проникновение и разработчиков программного обеспечения
  • PyEW − инструмент для анализа вредоносных программ
  • XSStrike − пакет обнаружения XSS, оснащенный рукописными анализаторами, механизмом фаззинга и сканером производительности

  • Eric IDE − редактор Python и IDE, основанные на Qt, с интегрированным управлением Scintilla
  • Gedit − текстовый редактор GNOME
  • Jupyter Notebook − веб-среда для интерактивных вычислений
  • Komodo Edit − многоязычный редактор кода, написанный на JS, Python и C ++, основанный на платформе Mozilla
  • Leo Editor − менеджер персональной информации
  • mu − небольшой, простой редактор, разработанный для начинающих программистов на Python
  • Ninja IDE − кросс-платформенная IDE Python с управлением проектами, линтингом, расширениями
  • Pluma − UTF-8 редактор для MATE
  • Spyder IDE − научная среда для ученых, инженеров и аналитиков данных с использованием Python
  • Thonny − среда разработки Python для начинающих, предназначенная для обучения программированию

Пакетные менеджеры

Image result for packet manager

  • Conda − независимый от ОС системный менеджер двоичных пакетов и экосистема, с акцентом на Python
  • dnf − Dandified YUM (DNF) − преемник yum
  • pip − менеджер пакетов Python
  • pipenv − обертка вокруг pip, virtualenv и pip-tools для более комфортного процесса управления пакетами
  • Poetry − независимый подход к управлению зависимостями и пакетированию в Python
  • Portage − система управления пакетами, созданная и используемая Gentoo Linux, а также Chrome OS, Sabayon и Funtoo Linux
  • yum − автоматическое средство обновления и установки/удаления пакетов для систем на основе RPM (Fedora, RHEL)

  • Bandersnatch − зеркальный клиент PyPI, соответствующий PEP 381
  • devpi − промежуточный сервер PyPI, а также инструмент для упаковки, тестирования, выпуска, с веб-интерфейсом и интерфейсом поиска − как PyPI
  • Warehouse − серверное программное обеспечение, поддерживающее PyPI, откуда загружается большинство библиотек Python

Создание

  • bitbake − механизм выполнения задач, позволяющий эффективно и параллельно выполнять задачи оболочки и Python при работе в рамках сложных ограничений зависимости между задачами
  • buildbot − система планирования с учетом потребностей непрерывной интеграции и упаковки программного обеспечения
  • Buildout − инструмент автоматизации развертывания
  • GYP − AKA ‘Generate Your Projects’, система сборки, которая генерирует другие системы сборки
  • Meson − система сборки, рассчитанная на скорость и удобство использования
  • Pants − сборка системы, предназначенной для монолитных хранилищ

Shell

  • Oil − новая оболочка, совместимая с bash и dash, с улучшенным собственным языком
  • Xonsh − кросс-платформенный язык оболочки и командная строка. Язык является расширенным набором Python 3.4+ с дополнительными примитивами оболочки.

Источник: Подборка проектов, созданных с помощью Python GitHub

10 шагов к успешному Python-проекту / RUVDS.com corporate blog / Habr

Материал, перевод которого мы сегодня публикуем, посвящён инструментам, которые позволяют оснащать Python-проекты средствами форматирования кода, тестирования, непрерывной интеграции и анализа зависимостей. Это помогает ускорить процесс разработки, способствует повышению качества, единообразия и безопасности кода. Предполагается, что у читателя этого материала уже есть некоторый опыт Python-разработки и проект на Python, с которым он, в ходе чтения, будет экспериментировать. Если такого проекта у вас нет — здесь можно узнать о том, как подготовить среду разработки и создать Python-пакет. Примеры, которые будут здесь приводиться, подготовлены с использованием macOS и Python 3.7.



Шаг 1. Установка Black



Код проекта должен следовать соглашениям о стиле кода. Black — это Python-пакет, который автоматически форматирует код, приводя его внешний вид к стандарту PEP 8. Black — это сравнительно новый проект, но у него уже набралось больше миллиона загрузок. Его использование быстро стало признаком хорошего тона в Python-разработке. Вот руководство по Black.

Я, в качестве редактора кода, использую Atom, поэтому я добавил в Atom пакет Python-Black. О том, как его установить, можно узнать здесь. После установки этого пакета Atom будет переформатировать код после сохранения файла.

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

Добавьте параметр black==18.9b0 в первую нашедшуюся свободную строку файла requirements_dev.txt и выполните команду install -r requirements_dev.txt.

Black, по умолчанию, устанавливает длину строки кода равной 88 символов. В некоторых руководствах по стилю, например — в Sphinx, требуется использовать длину строки, равную 79 символов. В настройках пакета Black-Atom можно задать желаемую длину строки.

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

Шаг 2. Создание файла .pypirc


Когда для отправки сборок приложения в TestPyPI и PyPI используется twine, сведения для входа в систему требуется вводить вручную. Если вы не знакомы с twine — взгляните на этот материал. Сейчас мы будем автоматизировать этот процесс.

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

Итак, создадим в домашней директории файл .pypirc:

touch ~/.pypirc

Добавим в него следующий текст:
[distutils]
index-servers =
    pypi
    testpypi

[testpypi]
repository: https://test.pypi.org/legacy
username = your_username
password = your_pypitest_password

[pypi]
username = your_username
password = your_pypi_password

Понятно, что сюда надо вписать ваши реальные имя пользователя и пароль. Кроме того, проверьте, чтобы этот файл был бы сохранён в домашней директории, а не в текущей рабочей директории. Если вы хотите защитить этот файл от других пользователей, вы можете, пользуясь средствами командной строки, настроить его разрешения:
chmod 600 ~/.pypirc

Теперь ваш пакет можно загружать в TestPyPI пользуясь следующей командой:
twine upload -r testpypi dist/*

В обычный PyPI можно загружать пакеты так:
twine upload dist/*

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

Теперь давайте добавим в нашу среду разработки инструменты тестирования, которые позволят проверить правильность работы пакета, созданием которого мы занимаемся.

Шаг 3. Установка и настройка pytest



Pytest — это самая популярная, лёгкая в использовании библиотека для тестирования кода, написанного на Python. В этом примере мы добавим в проект простые тесты. Вот, если вас интересуют подробности о pytest, хорошее вводное руководство по этому инструменту.

Добавим сведения о pytest в файл requirements_dev.txt:

pytest==4.3.0

Выполним установку пакета:
pip install requirements_dev.txt

Теперь выполним следующую команду, которая позволит pytest обнаружить наш пакет:
pip install -e .

Если вы деактивировали свою виртуальную среду разработки, то вам, для запуска тестов, понадобится снова выполнить обе команды pip.

Шаг 4. Создание тестов


Добавьте папку test в корневую директорию вашего проекта. Поместите в неё файл test_your_package_name.py. Мой файл называется test_notebookc.py. Если имя файла начинается с test_, pytest может автоматически обнаружить такой файл.

В файл test_notebookc.py я добавил следующий тест, который направлен на проверку того, правильное ли имя выводит функция. Модифицируйте этот код так, чтобы используемые в нём имена файлов и функций соответствовали бы вашим, опишите в нём собственные тесты.

"""Tests for `notebookc` package."""
import pytest
from notebookc import notebookc


def test_convert(capsys):
    """Correct my_name argument prints"""
    notebookc.convert("Jill")
    captured = capsys.readouterr()
    assert "Jall" in captured.out

Что здесь происходит?

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

После этого мы вызываем функцию (convert), передавая ей в качестве аргумента имя Jill. Далее — захватываем то, что выводит функция. Тут стоит сказать, что рассматриваемая функция крайне проста. Она берёт параметр my_name и делает следующее:

print(f"I’ll convert a notebook for you some day, {my_name}.")

Pytest проверяет, содержится ли Jall в том, что выводит функция. Там этой строки быть не должно, так как мы передаём функции Jill. Вот документация по pytest, в которой можно найти сведения о перехвате вывода.

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


В ходе теста выявлена ошибка

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

После того, как мы убедились в том, что тест дал сбой — поменяем в утверждении Jall на Jill и снова запустим тестирование. Теперь оно должно завершиться успешно.


Успешное завершение теста

Теперь всё хорошо. Тест позволяет убедиться в том, что если кто-то передаёт нашей функции строку, эта строка попадёт в тот текст, который выводит эта функция.

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

Когда мы создавали предыдущий тест, мы писали код, который приводит к успешному завершению теста. Это называется разработкой через тестировании (Test-Driven Development, TDD). TDD — это доказавший свою ценность подход к программированию, помогающий писать код, в котором оказывается меньше ошибок, чем в нём было бы без использования TDD. Вот полезный материал по TDD.

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

После того, как пакет успешно прошёл тесты — мы готовы к тому, чтобы воспользоваться системой непрерывной интеграции.

Шаг 5. Регистрация в сервисе Travis CI и его настройка



Travis CI — это «распределённый веб-сервис для сборки и тестирования программного обеспечения». Его недавно купила компания Idera. Существуют и другие системы непрерывной интеграции, но Travis CI — это популярный, бесплатный для опенсорсного применения и хорошо документированный инструмент, поэтому мы будем пользоваться именно им.

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

Cоздайте учётную запись на сайте https://travis-ci.org/. Далее, щёлкните по ссылке Review and add your authorized organizations на странице профиля. Вам предложат ввести пароль для доступа к GitHub. Щёлкните по Grant в разделе Organization access.


Настройка учётной записи Travis CI

Мне понадобилось синхронизировать аккаунт для того, чтобы в учётной записи появились бы сведения о notebooktoall и о репозитории notebookc. Обычно для того чтобы обработка кода средствами Travis CI заработала бы, требуется что-то около минуты. После этого нужно активировать репозиторий, воспользовавшись переключателем, показанным на следующем рисунке.


Активация репозитория

Теперь нужно щёлкнуть по кнопке Settings. Тут нужно указать, может ли Travis выполнять сборку на основе отправленных в репозиторий пулл-запросов или веток.


Настройка сборки проекта

Сейчас пришло время настроить проект, над которым мы работаем, что даст возможность Travis выполнять сборку проекта для каждого пулл-запроса.

Шаг 6. Создание файла .travis.yml


В корневой папке проекта создайте файл .travis.yml со следующим содержимым:
dist: xenial
language: python
python: 3.7.2
install:
  - pip install -r requirements_dev.txt
  - pip install -e .

script:
  - pytest

Строка dist: xenial нужна для того чтобы указать Travis на необходимость использования для организации виртуального окружения Ubuntu Xenial 16.04. Для тестирования кода Python 3.7 нужна именно Ubuntu Xenial, подробности об этом можно почитать здесь.

Раздел install позволяет обеспечить установку пакетов, используемых при разработке проекта. Команда pip install -e . выполняет установку нашего пакета в виртуальном окружении Travis. После этого Travis, запуская pytest, сможет найти наш пакет.

Шаг 7. Тестирование в Travis CI


Выполните коммит изменений, отправьте их на GitHub, выполните PR. Travis должен, в течение нескольких секунд, начать работу.
Travis за работой

Вот чем занимается Travis, обрабатывая проект.


Действия, выполняемые Travis при обработке проекта

Если PR оказался неудачным — Travis об этом сообщит. Обратите внимание на то, что если пулл-запрос оказался неудачным, то можно отправить изменения в ту же ветку и Travis автоматически примется за работу.

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

Если же предположить, что всё прошло хорошо, если на странице находятся надписи зелёного цвета, значит проверка и сборка проекта выполнены успешно.


Сборка проекта выполнена успешно

Если же на странице нет ни зелёных, ни красных надписей, откройте меню More options и выберите пункт Requests. Если вы видите тут сообщения об ошибках, выводимые красным цветом — проанализируйте их. Если вы видите сообщение об ошибке Build config file is required, это означает, что Travis не может найти в репозитории ваш файл .travis.yml. Исправьте это и ошибка исчезнет.

Travis отправляет пользователям электронные письма в тех случаях, когда сборка проекта оказывается неудачной, и в тех случаях, когда это удаётся исправить.

Помните о том, что в открытый PR можно отправлять коммиты и Travis будет автоматически перезапускать процесс сборки проекта.

Теперь проанализируем наш проект на предмет покрытия кода тестами.

Шаг 8. Оценка покрытия кода тестами


Отчёт о покрытии кода тестами позволяет узнать о том, какая часть кода проекта, пусть и небольшая, протестирована. Для создания подобных отчётов мы будем пользоваться пакетом pytest-cov.

В файл requirements_dev.txt добавим следующую строку:

pytest-cov==2.6.1

Выполним такую команду:
pytest --cov=my_project_name

В моём случае, после выполнения команды pytest --cov=notebookc был выведен следующий отчёт.
Отчёт о покрытии кода тестами

Как оказалось, весь код проекта обеспечен тестами. Таких показателей очень легко достичь в том случае, если весь проект состоит из нескольких строк кода.

Теперь поговорим о средстве, которое позволяет вести общедоступную историю состояния проекта в плане покрытия его кода тестами.

Шаг 9. Использование Coveralls


Проект Coveralls позволяет поддерживать исторические сведения о покрытии кода тестами.
Coveralls

Для того, чтобы воспользоваться возможностями этого проекта, нужно зарегистрироваться на сайте https://coveralls.io/, используя данные учётной записи GitHub. Потом нужно подключить репозиторий.

В файл requirements_dev.txt нужно добавить строку coveralls==1.6.0. Этот файл, кстати, на данном этапе работы над проектом должен выглядеть так:

pip==19.0.3
wheel==0.33.0
twine==1.13.0
pytest==4.3.0
pytest-cov==2.6.1
coveralls==1.6.0

Отредактируем файл .travis.yml, приведя его к такому виду (в вашем случае здесь будет название вашего проекта):
dist: xenial
language: python
python: 3.7.2
install:
  — pip install -r requirements_dev.txt
  — pip install -e .

script:
  — pytest --cov=my_package_name
after_success:
  — coveralls

Теперь, когда Travis будет собирать проект, он установит необходимые пакеты, запустит тесты и создаст отчёт о покрытии кода тестами. Затем этот отчёт будет отправлен на сервис Coveralls.

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


Обработка проекта, отчёт о покрытии кода тестами

Теперь среди проверок PR присутствует и проверка, выполняемая средствами Coveralls.

На странице Coveralls можно убедиться в том, что проект покрыт тестами на 100%.


Сведения о покрытии кода тестами

Теперь давайте оснастим наш проект ещё одним полезным инструментом.

Шаг 10. Работа с PyUp


Сервис PyUp.io позволяет разработчику узнавать о том, устарели ли используемые им зависимости, а также о том, имеют ли они уязвимости. Этот сервис автоматически выполняет пулл-запросы, направленные на обновление пакета на GitHub. Для того чтобы воспользоваться возможностями этого проекта, нужно зарегистрироваться, пользуясь учётной записью GitHub, на его сайте — https://pyup.io/. При добавлении репозитория рекомендуется установить периодичность обновлений (Update Schedules) в значение every week. При таком подходе, если у вашего проекта множество зависимостей, вы не столкнётесь со слишком большим количеством пулл-запросов.
Настройка обновлений

Вот как выглядят сведения о пакетах, некоторые из которых устарели, на сайте PyUp.io.


Сведения о пакетах

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

Итоги


Из этого материала вы узнали о том, как пользоваться при разработке Python-проектов такими средствами, как Black, pytest, Travis CI, Coveralls и PyUp. Они помогают контролировать зависимости проектов, форматировать и тестировать код, проверять и собирать проекты. Надеемся, вам эти инструменты пригодятся.

Уважаемые читатели! Какими инструментами вы пользуетесь при разработке Python-проектов?

Разработка мобильных приложений на Python. Библиотека KivyMD / Habr


Приветствую! Сегодня речь снова пойдет о библиотеке KivyMD — наборе виджетов для кроссплатформенной разработки на Python в стиле Material Design. В этой статье я сделаю не обзор виджетов KivyMD, как в недавней статье, а, скорее, это будет материал больше о позиционировании виджетов. Что-то похожего на туториал по разработке мобильных приложений на Python для новичков здесь не будет, так что если впервые слышите о фреймворке Kivy, вряд ли вам будет все это интересно. Ну, а мы погнали под кат!

На днях скачал из Google Play демонстрационное приложение Flutter UIKit:


И сейчас мы с вами попробуем повторить один экран из этого приложения. Давайте сразу посмотрим на результаты: слева — Flutter, справа — Kivy & KivyMD.

Некоторые элементы UI отличаются, не в силу каких-то технических особенностей, из-за которых нельзя было получить идентичный результат, а просто я посчитал, что так будет более органичней (например, черный Toolbar, по моему мнению, совсем не смотрится).

Итак! Что бросается в глаза, глядя на экран, который мы будем воспроизводить? Прозрачный фон переднего layout. В Kivy такую возможность предоставляет FloatLayout, который позволяет размещать в себе виджеты и контроллы один над другим следующим образом:


Схематично наш экран будет выглядеть так:
Разметка этого экрана довольно простая:
Почему я говорю о FloatLayout, если наш экран унаследован от Screen?
<ProductScreen@Screen>:

    ...

Просто потому, что Screen —> RelativeLayout —> FloatLayout.

Все виджеты во FloatLayout позиционируются от нижнего левого угла, то есть, на экране им автоматически присваивается позиция (0, 0). В разметке не сложно проследить порядок добавления элементов на экран сверху вниз:


Если кто-то обратил внимание, то позицию мы указали только одному виджету:
MDToolbar:
    ...
    pos_hint: {"top": 1}

Каждому виджету в Kivy помимо конкретных координат (x, y) можно указать подсказку позиции:
pos_hint: {"top": 1}  # верхняя граница экрана
pos_hint: {"bottom": 1}  # нижняя граница экрана
pos_hint: {"right": 1}  # правая граница экрана
pos_hint: {"center_y": .5}  # центр экрана по вертикали
pos_hint: {"center_x": .2}  # отступ в 20 % по горизонтали от левой границы экрана
...
...

Так вот, нижнее фоновое изображение…
    BoxLayout:
        size_hint_y: None
        height: root.height - toolbar.height

        FitImage:
            source: "smokestackheather.jpeg"

… благодаря виджету FitImage (библиотека KivyMD), автоматически растягивается на все выделенное ему пространство с сохранением пропорций изображения:

По умолчанию каждому виджету и лайоуту в Kivy предоставляется 100 % пространства, если не указанно иное. Например, если вы захотите добавить на экран одну кнопку, вы, очевидно сделаете следующее:

from kivy.app import App
from kivy.lang import Builder

KV = """
Button:
    text: "Button"
"""


class MyApp(App):
    def build(self):
        return Builder.load_string(KV)


MyApp().run()

И получите результат:
Кнопка заняла 100 % пространства. Чтобы разместить кнопку по центру экрана, нужно, во-первых, задать ей необходимый размер и, во-вторых, указать, где она будет находится:
from kivy.app import App
from kivy.lang import Builder

KV = """
Button:
    text: "Button"
    size_hint: None, None
    size: 100, 50
    pos_hint: {"center_y": .5, "center_x": .5}
"""


class MyApp(App):
    def build(self):
        return Builder.load_string(KV)


MyApp().run()

Теперь картина изменилась:
Также можно указать свойство size_hint, от 0 до 1, (эквивалент 0-100%), то есть, подсказка размера:
from kivy.app import App
from kivy.lang import Builder

KV = """
BoxLayout:

    Button:
        text: "Button"
        size_hint_y: .2

    Button:
        text: "Button"
        size_hint_y: .1

    Button:
        text: "Button"
"""


class MyApp(App):
    def build(self):
        return Builder.load_string(KV)


MyApp().run()


Или тоже самое, но подсказка ширины (size_hint_x):
from kivy.app import App
from kivy.lang import Builder

KV = """
BoxLayout:

    Button:
        text: "Button"
        size_hint_x: .2

    Button:
        text: "Button"
        size_hint_x: .1

    Button:
        text: "Button"
"""


class MyApp(App):
    def build(self):
        return Builder.load_string(KV)


MyApp().run()


MDToolbar имеет высоту в 56dp, не может занимать все пространство, и если ему не подсказать, что его место сверху, то он автоматически прилипнет к нижней части экрана:
Список карточек — OrderProductLayout (о нем мы поговорим ниже) — это ScrollView с элементами MDCard и он занимает всю высоту экрана, но благодаря padding (значения отступов в лайоутах) кажется, что он находится чуть выше центра экрана. Ну а MDBottomAppBar по умолчанию кидает якорь к нижней границе экрана. Поэтому только MDToolbar мы указали, где его место.

Теперь давайте посмотрим, что представляет из себя виджет OrderProductLayout:


Как видим, это четыре карточки, вложенные в ScrillView. В отличие от родительского экрана, который унаследован от FloatLayout, здесь все виджеты читаются сверху вниз.
Это очень удобно, поскольку прослеживается четкая иерархия виджетов, древовидная структура и с одного взгляда понятно, какой виджет/контролл какому лайоуту принадлежит. В Kivy наиболее частым используемым лайоутом является BoxLayout — коробка, которая позволяет размещать в себе виджеты по вертикали либо по горизонтали (по умолчанию — последнее):
Более наглядно это видно из следующей схемы, где используется BoxLayout горизонтальной ориентации:
Мы запретили BoxLayout использовать 100% пространства — size_hint_y: None и сказали — твоя высота будет ровно такой, какой будет высота самого высокого элемента, вложенного в тебя — height: self.minimum_height.

Список изображений:


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

        GridLayout:
            size_hint_y: None
            height: self.minimum_height
            cols: 1

Заменить строки (rows) на столбцы (cols) и указать в minimum не ширину, а высоту:
from kivy.app import App
from kivy.lang import Builder
from kivy.metrics import dp
from kivy.uix.button import Button

KV = """
ScrollView:

    GridLayout:
        id: box
        size_hint_y: None
        height: self.minimum_height
        spacing: "5dp"
        cols: 1
"""


class MyApp(App):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        for i in range(20):
            self.root.ids.box.add_widget(
                Button(
                    text=f"Label {i}",
                    size_hint_y=None,
                    height=dp(40),
                )
            )


MyApp().run()

Следующие карты — выбор цвета и размера (они практически идентичны):


Отличительной особенностью языка разметки Kv Language является не только четкая структура виджетов, но и то, что этот язык поддерживает некоторые возможности языка Python. А именно: вызов методов, создание/изменение переменных, логические, I/O и математические операции…
Вычисление значения value, объявленного в Label
        Label:
            value: 0
            text: str(self.value)

… происходит непосредственно в самой разметке:
        MDIconButton:
            on_release: label_value.value -= 1 if label_value.value > 0 else 0

И я никогда не поверю, что вот это (код Flutter)…

… логичнее и читабельнее кода Kv Language:


Вчера меня спрашивали, как у Kivy обстоят дела со средой разработки, есть ли автокомплиты, хотрелоад и прочие прелести? С автокомплитами все отлично, если пользоваться PyCharm:
Насчет хотрелоад… Python — интерпретируемый язык. Kivy использует Python. Соответственно, чтобы увидеть результат, не нужна компиляция кода, запустил — увидел/протестирвал. Как я уже говорил, Kivy не использует нативные API для рендера UI, поэтому позволяет эмулировать различные модели устройств и платформ с помощью модуля screen. Достаточно запустить ваш проект с нужными параметрами, чтобы на компьютере открылось окно тестируемого приложения так, как если бы оно было запущено на реальном устройстве. Звучит странно, но поскольку Kivy абстрагируется от платформы в отрисовке UI, это позволяет не использовать тяжелые и медленные эмуляторы для тестов. Это касается только UI. Например, тестовое приложение, описываемое в этой статье тестировалось с параметрами -m screen:droid2, portrait, scale=.75.

Слева — запущено на мобильном устройстве, справа — на компьютере:


Полный список параметров модуля screen:
devices = {
    # device: (name, width, height, dpi, density)
    'onex': ('HTC One X', 1280, 720, 312, 2),
    'one': ('HTC One', 1920, 1080, 468, 3),
    'onesv': ('HTC One SV', 800, 480, 216, 1.5),
    's3': ('Galaxy SIII', 1280, 720, 306, 2),
    'note2': ('Galaxy Note II', 1280, 720, 267, 2),
    'droid2': ('Motorola Droid 2', 854, 480, 240, 1.5),
    'xoom': ('Motorola Xoom', 1280, 800, 149, 1),
    'ipad': ('iPad (1 and 2)', 1024, 768, 132, 1),
    'ipad3': ('iPad 3', 2048, 1536, 264, 2),
    'iphone4': ('iPhone 4', 960, 640, 326, 2),
    'iphone5': ('iPhone 5', 1136, 640, 326, 2),
    'xperiae': ('Xperia E', 480, 320, 166, 1),
    'nexus4': ('Nexus 4', 1280, 768, 320, 2),
    'nexus7': ('Nexus 7 (2012 version)', 1280, 800, 216, 1.325),
    'nexus7.2': ('Nexus 7 (2013 version)', 1920, 1200, 323, 2),

    # taken from design.google.com/devices
    # please consider using another data instead of
    # a dict for autocompletion to work
    # these are all in landscape
    'phone_android_one': ('Android One', 854, 480, 218, 1.5),
    'phone_htc_one_m8': ('HTC One M8', 1920, 1080, 432, 3.0),
    'phone_htc_one_m9': ('HTC One M9', 1920, 1080, 432, 3.0),
    'phone_iphone': ('iPhone', 480, 320, 168, 1.0),
    'phone_iphone_4': ('iPhone 4', 960, 640, 320, 2.0),
    'phone_iphone_5': ('iPhone 5', 1136, 640, 320, 2.0),
    'phone_iphone_6': ('iPhone 6', 1334, 750, 326, 2.0),
    'phone_iphone_6_plus': ('iPhone 6 Plus', 1920, 1080, 400, 3.0),
    'phone_lg_g2': ('LG G2', 1920, 1080, 432, 3.0),
    'phone_lg_g3': ('LG G3', 2560, 1440, 533, 3.0),
    'phone_moto_g': ('Moto G', 1280, 720, 327, 2.0),
    'phone_moto_x': ('Moto X', 1280, 720, 313, 2.0),
    'phone_moto_x_2nd_gen': ('Moto X 2nd Gen', 1920, 1080, 432, 3.0),
    'phone_nexus_4': ('Nexus 4', 1280, 768, 240, 2.0),
    'phone_nexus_5': ('Nexus 5', 1920, 1080, 450, 3.0),
    'phone_nexus_5x': ('Nexus 5X', 1920, 1080, 432, 2.6),
    'phone_nexus_6': ('Nexus 6', 2560, 1440, 496, 3.5),
    'phone_nexus_6p': ('Nexus 6P', 2560, 1440, 514, 3.5),
    'phone_samsung_galaxy_note_4': ('Samsung Galaxy Note 4',
                                    2560, 1440, 514, 3.0),
    'phone_samsung_galaxy_s5': ('Samsung Galaxy S5', 1920, 1080, 372, 3.0),
    'phone_samsung_galaxy_s6': ('Samsung Galaxy S6', 2560, 1440, 576, 4.0),
    'phone_sony_xperia_c4': ('Sony Xperia C4', 1920, 1080, 400, 2.0),
    'phone_sony_xperia_z_ultra': ('Sony Xperia Z Ultra', 1920, 1080, 348, 2.0),
    'phone_sony_xperia_z1_compact': ('Sony Xperia Z1 Compact',
                                     1280, 720, 342, 2.0),
    'phone_sony_xperia_z2z3': ('Sony Xperia Z2/Z3', 1920, 1080, 432, 3.0),
    'phone_sony_xperia_z3_compact': ('Sony Xperia Z3 Compact',
                                     1280, 720, 313, 2.0),
    'tablet_dell_venue_8': ('Dell Venue 8', 2560, 1600, 355, 2.0),
    'tablet_ipad': ('iPad', 1024, 768, 132, 1.0),
    'tablet_ipad_mini': ('iPad Mini', 1024, 768, 163, 1.0),
    'tablet_ipad_mini_retina': ('iPad Mini Retina', 2048, 1536, 326, 2.0),
    'tablet_ipad_pro': ('iPad Pro', 2732, 2048, 265, 2.0),
    'tablet_ipad_retina': ('iPad Retina', 2048, 1536, 264, 2.0),
    'tablet_nexus_10': ('Nexus 10', 2560, 1600, 297, 2.0),
    'tablet_nexus_7_12': ('Nexus 7 12', 1280, 800, 216, 1.3),
    'tablet_nexus_7_13': ('Nexus 7 13', 1920, 1200, 324, 2.0),
    'tablet_nexus_9': ('Nexus 9', 2048, 1536, 288, 2.0),
    'tablet_samsung_galaxy_tab_10': ('Samsung Galaxy Tab 10',
                                     1280, 800, 148, 1.0),
    'tablet_sony_xperia_z3_tablet': ('Sony Xperia Z3 Tablet',
                                     1920, 1200, 282, 2.0),
    'tablet_sony_xperia_z4_tablet': ('Sony Xperia Z4 Tablet',
                                     2560, 1600, 297, 2.0)TodoList()
        app.run()

}


Ну, и, наконец, финальный результат — запуск на мобильном устройстве…


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

Надеюсь, был кому-то полезен, до новых встреч!

Разработка чрезвычайно быстрых программ на Python / RUVDS.com corporate blog / Habr

Ненавистники Python всегда говорят, что одной из причин того, что они не хотят использовать этот язык, является то, что Python — это медленно. Но то, что некая программа, независимо от используемого языка программирования, может считаться быстрой или медленной, очень сильно зависит от разработчика, который её написал, от его знаний и от умения создавать оптимизированный и высокопроизводительный код.

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

Измерение времени и профилирование


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

Ниже представлен код программы, который я буду использовать в демонстрационных целях. Он взят из документации к Python. Этот код возводит e в степень x:

# slow_program.py
from decimal import *

def exp(x):
    getcontext().prec += 2
    i, lasts, s, fact, num = 0, 0, 1, 1, 1
    while s != lasts:
        lasts = s
        i += 1
        fact *= i
        num *= x
        s += num / fact
    getcontext().prec -= 2
    return +s

exp(Decimal(150))
exp(Decimal(400))
exp(Decimal(3000))

Самый лёгкий способ «профилирования» кода


Для начала рассмотрим самый простой способ профилирования кода. Так сказать, «профилирование для ленивых». Он заключается в использовании команды Unix time:
~ $ time python3.8 slow_program.py

real 0m11,058s
user 0m11,050s
sys  0m0,008s

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

Самый точный способ профилирования


На другом конце спектра методов профилирования кода лежит инструмент cProfile, который даёт программисту, надо признать, слишком много сведений:
~ $ python3.8 -m cProfile -s time slow_program.py
         1297 function calls (1272 primitive calls) in 11.081 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        3   11.079    3.693   11.079    3.693 slow_program.py:4(exp)
        1    0.000    0.000    0.002    0.002 {built-in method _imp.create_dynamic}
      4/1    0.000    0.000   11.081   11.081 {built-in method builtins.exec}
        6    0.000    0.000    0.000    0.000 {built-in method __new__ of type object at 0x9d12c0}
        6    0.000    0.000    0.000    0.000 abc.py:132(__new__)
       23    0.000    0.000    0.000    0.000 _weakrefset.py:36(__init__)
      245    0.000    0.000    0.000    0.000 {built-in method builtins.getattr}
        2    0.000    0.000    0.000    0.000 {built-in method marshal.loads}
       10    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1233(find_spec)
      8/4    0.000    0.000    0.000    0.000 abc.py:196(__subclasscheck__)
       15    0.000    0.000    0.000    0.000 {built-in method posix.stat}
        6    0.000    0.000    0.000    0.000 {built-in method builtins.__build_class__}
        1    0.000    0.000    0.000    0.000 __init__.py:357(namedtuple)
       48    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:57(_path_join)
       48    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:59(<listcomp>)
        1    0.000    0.000   11.081   11.081 slow_program.py:1(<module>)

Тут мы запускаем исследуемый скрипт с использованием модуля cProfile и применяем аргумент time. В результате строки вывода упорядочены по внутреннему времени (cumtime). Это даёт нам очень много информации. На самом деле то, что показано выше, это лишь около 10% вывода cProfile.

Проанализировав эти данные, мы можем увидеть, что причиной медленной работы программы является функция exp (вот уж неожиданность!). После этого мы можем заняться профилированием кода, используя более точные инструменты.

Исследование временных показателей выполнения конкретной функции


Теперь мы знаем о том месте программы, куда нужно направить наше внимание. Поэтому мы можем решить заняться исследованием медленной функции, не профилируя другой код программы. Для этого можно воспользоваться простым декоратором:
def timeit_wrapper(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()  # В качестве альтернативы тут можно использовать time.process_time()
        func_return_val = func(*args, **kwargs)
        end = time.perf_counter()
        print('{0:<10}.{1:<8} : {2:<8}'.format(func.__module__, func.__name__, end - start))
        return func_return_val
    return wrapper

Этот декоратор можно применить к функции, которую нужно исследовать:
@timeit_wrapper
def exp(x):
    ...


print('{0:<10} {1:<8} {2:^8}'.format('module', 'function', 'time'))
exp(Decimal(150))
exp(Decimal(400))
exp(Decimal(3000))

Теперь после запуска программы мы получим следующие сведения:
~ $ python3.8 slow_program.py
module     function   time
__main__  .exp      : 0.003267502994276583
__main__  .exp      : 0.038535295985639095
__main__  .exp      : 11.728486061969306

Тут стоит обратить внимание на то, какое именно время мы планируем измерять. Соответствующий пакет предоставляет нам такие показатели, как time.perf_counter и time.process_time. Разница между ними заключается в том, что perf_counter возвращает абсолютное значение, в которое входит и то время, в течение которого процесс Python-программы не выполняется. Это значит, что на этот показатель может повлиять нагрузка на компьютер, создаваемая другими программами. Показатель process_time возвращает только пользовательское время (user time). В него не входит системное время (system time). Это даёт нам только сведения о времени выполнения нашего процесса.

Ускорение кода


А теперь переходим к самому интересному. Поработаем над ускорением программы. Я (по большей части) не собираюсь показывать тут всякие хаки, трюки и таинственные фрагменты кода, которые волшебным образом решают проблемы производительности. Я, в основном, хочу поговорить об общих идеях и стратегиях, которые, если ими пользоваться, могут очень сильно повлиять на производительность. В некоторых случаях речь идёт о 30% повышении скорости выполнения кода.

▍Используйте встроенные типы данных


Использование встроенных типов данных — это совершенно очевидный подход к ускорению кода. Встроенные типы данных чрезвычайно быстры, в особенности — если сравнить их с пользовательскими типами, вроде деревьев или связных списков. Дело тут, в основном, в том, что встроенные механизмы языка реализованы средствами C. Если описывать нечто средствами Python — нельзя добиться того же уровня производительности.

▍Применяйте кэширование (мемоизацию) с помощью lru_cache


Кэширование — популярный подход к повышению производительности кода. О нём я уже писал, но полагаю, что о нём стоит рассказать и здесь:
import functools
import time

# кэширование до 12 различных результатов
@functools.lru_cache(maxsize=12)
def slow_func(x):
    time.sleep(2)  # Имитируем длительные вычисления
    return x

slow_func(1)  # ... ждём 2 секунды до возврата результата
slow_func(1)  # результат уже кэширован - он возвращается немедленно!

slow_func(3)  # ... опять ждём 2 секунды до возврата результата

Вышеприведённая функция имитирует сложные вычисления, используя time.sleep. Когда её в первый раз вызывают с параметром 1 — она ждёт 2 секунды и возвращает результат только после этого. Когда же её снова вызывают с тем же параметром, оказывается, что результат её работы уже кэширован. Тело функции в такой ситуации не выполняется, а результат возвращается немедленно. Здесь можно найти примеры применения кэширования, более близкие к реальности.

▍Используйте локальные переменные


Применяя локальные переменные, мы учитываем скорость поиска переменной в каждой области видимости. Я говорю именно о «каждой области видимости», так как тут я имею в виду не только сопоставление скорости работы с локальными и глобальными переменными. На самом деле, разница в работе с переменными наблюдается даже, скажем, между локальными переменными в функции (самая высокая скорость), атрибутами уровня класса (например — self.name, это уже медленнее), и глобальными импортированными сущностями наподобие time.time (самый медленный из этих трёх механизмов).

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

#  Пример #1
class FastClass:

    def do_stuff(self):
        temp = self.value  # это ускорит цикл
        for i in range(10000):
            ...  # Выполняем тут некие операции с `temp`

#  Пример #2
import random

def fast_function():
    r = random.random
    for i in range(10000):
        print(r())  # здесь вызов `r()` быстрее, чем был бы вызов random.random()

▍Оборачивайте код в функции


Этот совет может показаться противоречащим здравому смыслу, так как при вызове функции в стек попадают некие данные и система испытывает дополнительную нагрузку, обрабатывая операцию возврата из функции. Однако эта рекомендация связана с предыдущей. Если вы просто поместите весь свой код в один файл, не оформив в виде функции, он будет выполняться гораздо медленнее из-за использования глобальных переменных. Это значит, что код можно ускорить, просто обернув его в функцию main() и один раз её вызвав:
def main():
    ...  # Весь код, который раньше был глобальным

main()

▍Не обращайтесь к атрибутам


Ещё один механизм, способный замедлить программу — это оператор точка (.), который используется для доступа к атрибутам объектов. Этот оператор вызывает выполнение процедуры поиска по словарю с использованием __getattribute__, что создаёт дополнительную нагрузку на систему. Как ограничить влияние этой особенности Python на производительность?
#  Медленно:
import re

def slow_func():
    for i in range(10000):
        re.findall(regex, line)  # Медленно!

#  Быстро:
from re import findall

def fast_func():
    for i in range(10000):
        findall(regex, line)  # Быстрее!

▍Остерегайтесь строк


Операции на строках могут сильно замедлить программу в том случае, если выполняются в циклах. В частности, речь идёт о форматировании строк с использованием %s и .format(). Можно ли их чем-то заменить? Если взглянуть на недавний твит Раймонда Хеттингера, то можно понять, что единственный механизм, который надо использовать в подобных ситуациях — это f-строки. Это — самый читабельный, лаконичный и самый быстрый метод форматирования строк. Вот, в соответствии с тем твитом, список методов, которые можно использовать для работы со строками — от самого быстрого к самому медленному:
f'{s} {t}'  # Быстро!
s + '  ' + t
' '.join((s, t))
'%s %s' % (s, t)
'{} {}'.format(s, t)
Template('$s $t').substitute(s=s, t=t)  # Медленно!

▍Знайте о том, что и генераторы могут работать быстро


Генераторы — это не те механизмы, которые, по своей природе, являются быстрыми. Дело в том, что они были созданы для выполнения «ленивых» вычислений, что экономит не время, а память. Однако экономия памяти может привести к тому, что программы будут выполняться быстрее. Как это возможно? Дело в том, что при обработке большого набора данных без использования генераторов (итераторов) данные могут привести к переполнению L1-кэша процессора, что значительно замедлит операции по поиску значений в памяти.

Если речь идёт о производительности, очень важно стремиться к тому, чтобы процессор мог бы быстро обращаться к обрабатываемым им данным, чтобы они находились бы как можно ближе к нему. А это значит, что такие данные должны помещаться в процессорном кэше. Этот вопрос затрагивается в данном выступлении Раймонда Хеттингера.

Итоги


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

Уважаемые читатели! Как вы подходите к оптимизации производительности своего Python-кода?

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

Язык программирования Python: разработка веб-приложений для нового поколения

От автора: после создания нескольких бэкендов на PHP уважающий себя программист начинает искать альтернативу этому языку. Кто-то выберет Java и будет прав. Но то, кто захочет прочувствовать, что такое на Python разработка веб приложений, уже никогда не захочет работать с чем-либо другим. Язык развивается стремительно, а его коммерческое применение оправдывает себя с каждым новым проектом. Сегодня мы расскажем, почему он так хорош для web-разработки, и какие препятствия подстерегают новичка.

Язык программирования Python: разработка веб-приложений для нового поколения

Что такое Python, и зачем его изобрели

В отличии от PHP, который годится для web-разработки и некоторых экспериментов в других областях, Python считается универсальным языком. Он может быть одинаково хорош для мобильных приложений, «фронта» сайтов, создания программного обеспечения для борьбы с малваром и прочего. Вся суть программирования на Питоне в том, что на нем можно написать абсолютно все.

Python — сравнительно немолодой язык для web-разработки: задуман в 1980-ом, а реализован ближе к девяностым. Его автор, Гвидо ван Россум, хотел усовершенствовать язык ABC, который использовался для обучения, но имел ряд недостатков. В итоге, из хобби Россума получился высокоуровневый скриптовый PL, благодаря которому web-разработка поднялась на новый уровень.

Если сравнивать с PHP, который до сих пор является лидером в плане создания сайтов, то на Питоне весь процесс проходит значительно быстрее. К тому же, это язык, который поддерживает объектно-ориентированное программирование, что тоже является плюсом. Серьезные разработчики привыкли работать именно так.

Язык программирования Python: разработка веб-приложений для нового поколения

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

Язык программирования Python: разработка веб-приложений для нового поколения

У языка даже есть свой манифест, который принято называть философией. Ее написал Тим Петерс. Некоторые из лозунгов будем использовать. Например, с следующем заголовке.

Читаемость имеет значение

Это один из основных лозунгов Python, который напрямую влияет на его распространенность в web-разработке. Создатели сделали упор не на мощности самого кода, а на продуктивности разработчиков, которые с ним работают. Это один из пунктов, которые отличают язык от PHP. На «препроцессоре» лучше всего получается код, который может прочитать лишь его автор. Для работы в команде такой подход не пройдет. Даже самая сложная система расчета будет выглядеть понятнее, чем стандартные приложения на Java и С-подобных. Человек, далекий от программирования на Питоне, но понимающий принципы создания программы, сможет понять общую картину.

Для нового поколения сети

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

Итак, у языков Java, С, и PHP есть своя аудитория почитателей. У каждого из них есть свои сильные стороны, которые активно ставят в упрек тем, кто пишет на Питоне. Но правда в том, что крупные компании охотно верят в Python, создавая на основу для своих бизнес-процессов. И хотя у основного конкурента в этой сфере (Java) скорость выполнения кода выше, Пайтон берет свое благодаря простоте написанной программы. Ее легче редактировать и выявлять ошибки. Ну, а если говорить о web-разработке, то здесь время исчисляется минутами. Не сумел поднять сервер, и вот — юзеры перешли к конкуренту.

В Python верят такие акулы бизнеса, как Google. Первый их кроулер был полностью реализован на Питоне. Но здесь прагматизм сыграл свою роль: через некоторое время его пришлось заменить на тот, который создали с помощью С++. Поверьте, такая нагрузка, как на Google, не ждет ни один ваш проект — создавайте на Python и не почувствуете разницы. К примеру, сервис PayPal тоже создан на Питоне, и это не мешает ему демонстрировать миру свое быстродействие. И, конечно же, известные пользователю Instagram и Spotify тоже созданы на основе Python (десктоп-версии).

Но где и правда web-разработка с помощью Python хороша, так это в создании веб-приложений статистического характера. Для этого у Питона есть даже специальная библиотека — Dash. Ее можно загрузить с помощью обычной команды в консоли и начинать разработку своего аналитического гиганта. Почти все подобные сервисы, вроде расчета популяции людей или роста курса инфляции, созданы на Питоне при помощи библиотеки Dash. Приятно и то, что созданные графики и таблицы можно преображать в плане интерфейса, будто вы работаете с CSS.

Язык программирования Python: разработка веб-приложений для нового поколения

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

Для того чтобы разработанные «аналитики» выглядели хорошо, библиотека еще и оснащена элементами Graph. Как и понятно из названия, она призвана обеспечить всеми видами графиков, которые только может представить разработчик.

Преимущества на миллион

В целом, вы уже понимаете, насколько хорош Python для web-разработки. Его все используют, и он эффективен. Так давайте оформим все в список преимуществ, которые характеризуют работу с этим языком программирования:

широкое распространение. Это всегда плюс, и мы уже о нем говорили. Все вокруг используют Python, даже Дисней. Следствием этого факта является то, что многое о нем уже известно. Как только вы сталкиваетесь с проблемой при программировании на Питоне, тотчас же можете обратиться за помощью в поисковик: скорее всего, вашу проблему уже кто-то решал. К тому же, для реализации практически любого проекта уже существуют заготовки, которые можно применить для себя;

разнообразие реализаций. Самая известная и каноническая — это CPython, реализация на С. Это значит, что код, написанный на нем, полностью взаимодействует с С, и библиотеки этого языка тоже можно применять для реализации. То же самое касается и языка Java. Существует и реализация на нем — Jython. Таких примеров масса, вплоть до взаимодействия Питона с Android и iOS;

простота языка. Нет, никто не говорит, что Python — это просто. Но если сравнить языки с такими же возможностями, то он явно впереди всех. Это значит, что его можно использовать не только в web-разработке, но и в любой другой области, где специалисты не имеют глубоких познаний в программировании. Например, если вы изучаете астрономию и хотите проводить сложные вычисления, то Java вам точно не подойдет. Синтаксис в Python похож на обыкновенные математические операции и не несет в себе дополнительной сложности;

скорость. Не удивляйтесь, когда немного ниже вы увидите этот пункт в списке недостатков. На самом деле, здесь все относительно. Несмотря на то, что программирование на Питоне может создавать более медленный код, чем Java или С, он все же значительно более быстр, чем JavaScript, PHP или Ruby. К тому же, за последние несколько лет проект PyPy сумел значительно «ускорить» Питон.

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

Все преодолимо!

Именно с этим лозунгом хочется начать рассказ о недостатках Python. Язык настолько быстро развивается, что уже через несколько лет наши слова будут неактуальными. Активно проводится работа над проблемами, которые сегодня преследуют web-разработку на Python.

Язык программирования Python: разработка веб-приложений для нового поколения

Как и обещали, первой и единственной из них будет скорость. Именно на ней завязаны все последующие недостатки. Существует несколько подходов, объясняющих, почему этот язык работает медленнее, чем его статические собратья (С-семья и Java). Первый настаивает на том, что причиной всему Gil — Global Interpreter Lock. И это правда: замок блокирует потоки для того, чтобы не разрушить данные, которые в них перемещаются. Как только опасность минует, он их освобождает. Эта технология призвана обеспечить стабильность, но, как результат, замедляет работу. Хорошая новость в том, что программисты придумали массу решений этой проблемы, а в новой версии языка сам процесс значительно оптимизирован.

Вторая причина может быть в динамической типизации. Когда-то это был инструмент, который облегчает задачу начинающим разработчикам. Но в больших проектах следить за динамическими данными будет сложно. Потому web-разработка таких приложений с помощью Python требует опыта. Такие компании, как Dropbox, решают эту проблему благодаря специфическим реализациям — проект Pyston.

На этом у нас все! Учите Python! Используйте Python!

Язык программирования Python: разработка веб-приложений для нового поколения

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее Язык программирования Python: разработка веб-приложений для нового поколения

Разработка веб-приложения на PHP

Создайте веб-приложение на PHP на примере приема платежей на сайте

Смотреть

11 проектов, которые должен разработать каждый питонист

Уверены, что хорошо знаете Python? Проверьте, сможете ли вы разработать эти проекты на Python. Если нет − бегом читать наши туториалы.

Агрегатор контента

Контент помогает нам принимать решения − весь поток информации, публикуемый в блогах, соцсетях, на экране, является контентом. Единственный способ оставаться в курсе событий, не терять компетенцию − постоянно потреблять контента. Но поиск утомителен.

Для этого создают агрегаторы контента. Их суть в том, чтобы собирать разные, релевантные вам статьи, посты в соцсетях и собирать всё в одном месте.

Примеры реализации

Техническая реализация

Определитесь, с каких сайтов контент-агрегатор будет загружать информацию. Можно использовать библиотеки Requests для отправки HTTP-запросов, BeautifulSoup для анализа материалов и выделения наиболее подходящей информации.

Чтобы агрегация контента происходила в фоновом режиме, стоит обратить внимание на библиотеки Celery или Apscheduler.

А еще подумайте о базе данных, в которой будет храниться собранная информация.

Все мы читаем тексты. И когда у них плохая структура, нам не нравится. Из-за этого мы не всегда можем найти нужную информацию.

С помощью инструмента Regex Query Tool пользователи могут быстро проверить правильность своих строк регулярных выражений в интернете.

Было бы неплохо добавить функцию замены совпадений.

Примеры реализации

Техническая реализация

Такие проекты на Python нужны, чтобы сообщать пользователю, правильно ли он ввёл данные. Можно сделать так, чтобы сервис давал положительный или отрицательный ответ, вроде Query String Is Valid, выделяя положительный ответ зеленым цветом, а отрицательный − красным.

Реализовывать инструмент запросов с нуля необязательно. Можно обратиться к стандартной библиотеке Re. Она будет возвращать None при отсутствии совпадений или возвращать совпавшие строки.

Не все понимают, как работают регулярные выражения, поэтому стоит создать раздел с объяснением принципов их работы.

URL Shortener

URL-адреса бывают очень длинными, это неудобно. Когда люди делятся ссылками в мессенджерах или даже пытаются запомнить URL, неаккуратные ссылки раздражают.

Вот как это работает: URL Shortener уменьшает количество символов в URL. xyz.com/wwryb78&svnhkn%sghq?sfiyh может быть сокращено до xyz.com/piojwr.

Будет ещё круче , если вы позволите юзерам самостоятельно настраивать сгенерированные URL-адреса. URL xyz.com/mysite выглядит на порядок лучше, чем случайно сгенерированный xyz.com/piojwr.

А еще Google прекратил поддержку своего сервиса goo.gl, так что у вас есть шанс сделать свой продукт популярнее.

Примеры реализации

Техническая реализация

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

В приложении пользователи будут вводить исходный URL-адрес и в результате получат новый сокращенный URL-адрес. Для этого стоит использовать комбинацию random и string.

Поскольку пользователи будут посещать сокращенные URL-адреса через несколько дней, месяцев или даже лет, вам необходимо сохранить сокращенные URL-адреса в базе данных. При поступлении запроса приложение проверит, существует ли URL-адрес, и перенаправит его на оригинал или страницу 404.

Post-It Note

Мы постоянно о чём-то думаем, а ещё постоянно забываем. Один из способов запомнить − записать, чтобы обдумать позднее.

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

Было бы неплохо добавить напоминания о заметках, если вдруг пользователь забудет о них.

Примеры реализации

Техническая реализация

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

Django поставляется с системой аутентификации пользователя, так что это может быть одним из способов реализации идеи. Можно также использовать другие фреймворки, например, Bottle или Flask. Но вы должны самостоятельно внедрить систему аутентификации пользователей.

Юзерам может потребоваться разделить заметки по разным разделам: полезно реализовать классификацию. Например, кому-то могут понадобиться заметки об алгоритмах и структурах данных, поэтому нужно дать возможность быстро найти информацию по теме, а не листать веб-страницу.

Опять же, вам нужно где-то хранить поступающую информацию. Для MySQL можно использовать MySQLdb, а для PostgreSQL − Psycopg2.

Викторина

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

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

Примеры реализации

Техническая реализация

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

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

Сигнализация

Идея в том, чтобы имитировать звук сигнализации при каком-либо условии. Этим условием может быть наступление какого-то времени или разрядка ноутбука до 10%.

Примеры реализации

Техническая реализация

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

Для воспроизведения аудио можно использовать библиотеку Pygame.

Файловый менеджер

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

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

Кстати, неплохо бы добавить разные варианты просмотра и сортировки файлов, поиск.

Примеры реализации

Техническая реализация

Для создания уникальных пользовательских интерфейсов стоит использовать библиотеку PySimpleGUI.

Стоит также подумать о реализации таких функций, как создание новых папок или пустых текстовых файлов, их перемещения.

При реализации проекта стоит обратить внимание на библиотеки Sys, OS и Shutil. Они позволяют выполнять процессы в фоновом режиме, пока пользователь занимается чем-то другим.

Контроль расходов

Каждый день мы совершаем по несколько платёжных операций. Если их не контролировать, можно не заметить, как деньги уходят впустую. Чтобы избежать ненужных трат, придумали приложения для отслеживания расходов.

Наиболее продвинутые из них не просто показывают список трат за определённы период, но и подсказывают, какие категории расходов стоит сократить.

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

Было бы неплохо добавить напоминания о необходимости анализа расходов.

Примеры реализации

Техническая реализация

Для построения системы отслеживания расходов могут пригодиться Pandas и Matplotlib.

Pandas − для анализа данных, а Matplotlib − для построения графиков. Графики дают пользователям визуальное представление о своих расходах, а визуальное представление обычно легче понять.

Что касается хранения информации, то стоит обратиться к SQLite и её модулю SQlite3.

Контакты

Вы еще записываете контакты на бумагу? Странная затея: блокнот может потеряться, и его нужно носить с собой.

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

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

Примеры реализации

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

Техническая реализация

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

Значительную часть работы будут выполнять Argparse и Click. Вам остаётся только подумать о логике выполнения команд. Вам также нужно реализовать удаления контактов, обновление информации и вывод списка сохранённых. Идеально, если они будут сортироваться по алфавиту или дате создания.

Проверка подключения к сайту

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

Здесь на помощь приходит приложение для проверки подключения к сайту. Сервис анализирует статус URL-адреса и сообщает его. Так можно не обновлять страницу N раз в ожидании загрузки сайта.

Но! Если отображать результаты в командной строке, пользователю нужно будет обновлять её вручную. Лучше потратить больше времени и реализовать уведомления о появлении доступа к сайту.

Примеры реализации

Техническая реализация

Для подключений можно использовать TCP или ICMP. Один из модулей, которые нужно проверить − Socket.

Фреймворки Docopt, Click или Argparse позволят изменять список сайтов для проверки. Ещё подумайте о введении интервалов для проверки, чтобы не перегружать систему.

Изменение имени файлов

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

Наш сервис позволит пользователям автоматически переименовать большое количество файлов и не допустить случайных ошибок.

Кстати, иногда нужно переименовать лишь часть файлов в папке. Хорошо, если такая функция тоже будет.

Примеры реализации

Техническая реализация

Для манипуляций с файлами пригодятся библиотеки OS, Sys и Shutil.

Чтобы сервис понял, по какой системе нужно менять названия файлов, дайте ему шаблон. Если вы понимаете, как работают регулярные выражения, воспользуйтесь модулем Regex.

Банальная задача − назвать файлы по списку или привести их в общий вид путем изменения MyfilesXYZ, где XYZ − число. Это должно быть базовой функцией, чтобы не усложнять пользователям жизнь.

Понравилось разрабатывать подобные проекты на Python? Вам понравится:

Источник: Проекты на Python, которые сможет разработать любой Middle Python Developer на Realpython.

А у вас есть свой проект на Python? Расскажите о нем.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *