Python Academy
49.5K subscribers
1.08K photos
2 videos
374 links
Python Academy — один канал вместо тысячи учебников

Чат канала: @python_academy_chat

Сотрудничество: @zubar89

Канал включён в перечень РКН: https://rkn.link/TVu
加入频道
Минималистичный ORM

Для любителей работать с базами данных SQLite 3 или MySQL наш подписчик разрабатывает простой и эффективный способ взаимодействия – библиотека mysqlite.

Такая компактная ORM является промежуточным этапом между работой со всеми знакомым SQLAlchemy и использованием чистого SQL у себя в коде.

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

P. S. Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.

#проектподписчика
Простой вариант абстрактного метода

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

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

Но здесь есть существенный минус – при создании экземпляра класса, наследованного от подобного родителя, не возникнет ошибки. Только вызов метода выдаст исключение. А такое поведение является не очень явным для абстрактного класса.

#классы
Удаление префиксов и суффиксов

По какой-то неизведанной причине многие разработчики посчитали эту фичу в обновлении 3.9 не очень интересной и попросту забыли. И зря.

Некоторые на полном серьезе для таких целей до сих пор пытаются использовать забагованные .strip и .lsrtip. Точнее, большинство просто не до конца понимают, как работают эти два метода.

И всё же, в Python 3.9 были добавлены методы для строк .removeprefix и .removesuffix, предназначенные специально для удаления префиксов и суффиксов в строках.

#строки
Упрощение создания операторов сравнения

Для создания объектов с поддержкой операторов сравнения в классе обычно требуется реализовать большое количество магических методов, а именно – __lt__, __le__, __eq__, __ne__, __gt__, __ge__.

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

В таком случае достаточно реализовать в классе только __lt__ и __eq__. Эти два метода являются минимумом, который нужен декоратору для конструирования остальных методов.

#классы
Первые шаги в Python

Специально для начинающих сделали универсальную подборку ресурсов для изучения Python с полного нуля.

Подборка включает в себя бесплатные онлайн-курсы, книги, YouTube каналы, сайты для практики и другое.

Читать 2 минуты

#статья
Перегрузка операторов сравнения

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

Например, под капотом записи a < b вызывается a.__lt__(b). Для каждого оператора сравнения существует свой магический метод. Подробнее про то, какой метод за какой оператор отвечает, выше в коде.

Писать все шесть методов получается слегка громоздко, поэтому зачастую используют декоратор total_ordering из functools. Про него, кстати, недавно писали пост.

#классы
Быстрое написание ботов ВК

Библиотека LiteVkApi написана на основе обычного VK API для упрощения написания ботов для ВК. Пакет позволяет абстрагироваться от работы с API и сконцентрироваться на самом боте.

В примере скрипт отправляет сообщение "И тебе привет!", если боту написали "Привет!". Присылает клавиатуру с кнопками "Привет!" и "Закрыть клавиатуру!" на команду "Клавиатура". А на фразу "Закрыть клавиатуру" бот её удалит с экрана пользователя.

Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.

#проектподписчика
Список импортов по умолчанию

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

Таким образом, при импорте вида from module import * из модуля c подобной записью подключатся только объекты с названиями из списка __all__.

Тем не менее, в примере выше импортировать функцию foo из такого модуля всё ещё можно, например, с помощью записи from module import foo.

#модули
База данных на минималках

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

Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод shelve.open поддерживает протокол контекстного менеджера, то есть можно не вызывать метод close.

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

#shelve
Сохраняем бинарные данные

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

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

Однако будьте осторожнее, pickle не защищен от ошибочных или вредоносных данных. Никогда не извлекайте данные, полученные из ненадежных или не прошедших проверку подлинности источников.

#pickle
Пишем асинхронных ботов для ВК

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

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

Код, написанный на vkbottle, чем-то похож на всем знакомый flask. А пример выше реализует бота, который отвечает сообщением "Здравствуй!" на "Привет".

#боты #vk
Задай свой вопрос в нашем чате

Если вы ещё не знаете, то у нас есть активный чат, в котором уже 1200+ участников.

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

@python_academy_chat
Django Telegram Logger

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

Модуль устанавливается через пакетный менеджер pip. Для его настройки требуется добавить "telegram_logger" в INSTALLED_APPS, а также "TelegramLoggerMiddleware" в MIDDLEWARE_CLASSES.

И ещё надо указать токен бота в Telegram и user_id аккаунта, на который будут приходить уведомления. Это всё делается в словаре TELEGRAM_LOGGER_CONF
в файле настроек Django.

Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.

#проектподписчика
Аннотации типов: Union и Optional

Ранее на канале был пост про базовые аннотации типов. Но важно знать и про такие аннотации, как Union и Optional.

При необходимости допустить использование не любых типов, а только некоторых, можно использовать аннотацию Union[T, ...] с указанием списка типов в квадратных скобках.

Для объявления опциональных переменных используется Optional[T]. Такая аннотация нужна для переменных, которые либо имеют значение определенного типа, либо равны None.

Кстати, аннотация Optional[T] эквивалентна Union[T, None].

#аннотации
Заменяем часть строки

Со строками в Python работать очень удобно, так как встроенных методов для них предостаточно. Одним из методов является str.replace(), который позволяет заменять части строк.

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

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

#строки
Создаем пакеты

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

При импорте вида from package import * будет подключены либо все модули и объекты модуля __init__.py, либо то, что находится в переменной __all__ в том же модуле __init__.py — подробнее про эту переменную было в посте ранее.

Также примечателен файл init.py, который раньше был обязателен для создания пакетов. С версии Python 3.3 его необходимость пропала. Однако его функциональность на этом не заканчиваются.

#модули #пакеты
Создаем виртуальное окружение

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

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

Скрипт activate в директории bin предназначен для активации окружения, а команда deactivate в уже активированном окружении — для выхода из него.

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

#venv
ORM для PostgreSQl и SQlite3

ViBranium — это ORM, которая умеет работать с базами данных PostgreSQl и SQlite3. Помимо функционала для работы с бд, в пакете также есть удобные модули для логирования и шифрования.

А поскольку далеко не все данные следует хранить в чистом виде, вы можете пропустить их через хеш-функции с помощью класса Encrypt, который есть внутри ViBranium. 

Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале. 

#проектподписчика
Статические методы

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

Статический метод не принимает ни объект (self), ни класс (cls) в аргументах. То есть такие методы не могут модифицировать ни объект, ни сам класс. 

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

Но так делать не принято, поэтому чаще всего staticmethod используют в качестве декоратора при написании методов прямо в классе.

#staticmethod
Находим наименьшие и наибольшие

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

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

С помощью методов nsmallest и nlargest можно получить наименьшие и наибольшие элементы в списке.

Первым аргументов передается, сколько элементов нужно взять, вторым — список.

#heap
Получаем информацию о памяти на диске

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

Но с помощью shutil мы можем даже получить информацию о памяти на жестком диске компьютера. Метод disk_usage возвращает количество всей, занятой и свободной памяти.

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

#shutil