База данных на минималках
Встроенный модуль
Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод
В документации заявляют, что такая база данных является "надежной". Но учитывая, что
#shelve
Встроенный модуль
shelve
позволяет сохранять и читать произвольные данные. Таким образом, можно сохранять любые Python объекты для дальнейшего использования. Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод
shelve.open
поддерживает протокол контекстного менеджера, то есть можно не вызывать метод close
. В документации заявляют, что такая база данных является "надежной". Но учитывая, что
shelve
написан на pickle
, его стоит использовать только в совсем маленьких проектах.#shelve
Сохраняем бинарные данные
Модуль
Но классы, функции и методы сохранить не получится. Здесь также важно понимать, что при сохранении объекта сохраняется строка, указывающая, к какому классу относится этот объект.
Однако будьте осторожнее,
#pickle
Модуль
pickle
, который мы затронули в прошлом посте, реализует двоичные протоколы для сериализации и десериализации объектов. Вы можете сохранить любой объект, если возможно перевести каждый его атрибут в двоичный вид. Но классы, функции и методы сохранить не получится. Здесь также важно понимать, что при сохранении объекта сохраняется строка, указывающая, к какому классу относится этот объект.
Однако будьте осторожнее,
pickle
не защищен от ошибочных или вредоносных данных. Никогда не извлекайте данные, полученные из ненадежных или не прошедших проверку подлинности источников.#pickle
Пишем асинхронных ботов для ВК
Под постом про проект подписчика, связанный с написанием ВК ботов, в комментариях упомянули про модуль
Библиотека является асинхронной и требует минимум кода со стороны разработчика, что позволяет сконцентрироваться на задаче, не тратя силы и время на само взаимодействие с API.
Код, написанный на
#боты #vk
Под постом про проект подписчика, связанный с написанием ВК ботов, в комментариях упомянули про модуль
vkbottle
, про который сейчас и расскажем.Библиотека является асинхронной и требует минимум кода со стороны разработчика, что позволяет сконцентрироваться на задаче, не тратя силы и время на само взаимодействие с API.
Код, написанный на
vkbottle
, чем-то похож на всем знакомый flask
. А пример выше реализует бота, который отвечает сообщением "Здравствуй!" на "Привет". #боты #vk
Задай свой вопрос в нашем чате
Если вы ещё не знаете, то у нас есть активный чат, в котором уже 1200+ участников.
Присоединяйтесь, задавайте свои вопросы и не забывайте помогать другим.
@python_academy_chat
Если вы ещё не знаете, то у нас есть активный чат, в котором уже 1200+ участников.
Присоединяйтесь, задавайте свои вопросы и не забывайте помогать другим.
@python_academy_chat
Django Telegram Logger
Наш подписчик написал удобное расширение для фреймворка Django, которое представляет из себя логгер для Telegram. Можете ознакомиться с исходным кодом.
Модуль устанавливается через пакетный менеджер
И ещё надо указать токен бота в Telegram и
в файле настроек Django.
Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
Наш подписчик написал удобное расширение для фреймворка 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 работать очень удобно, так как встроенных методов для них предостаточно. Одним из методов является
Первым аргументом передается подстрока, которая будет изменяться в исходной строке. Вторым аргументом — то, на что будет заменяться.
Также есть третий, опциональный, аргумент, который отвечает за то, сколько раз вы хотите заменить старую подстроку на новую. По умолчанию, все вхождения заменяются.
#строки
Со строками в Python работать очень удобно, так как встроенных методов для них предостаточно. Одним из методов является
str.replace()
, который позволяет заменять части строк.Первым аргументом передается подстрока, которая будет изменяться в исходной строке. Вторым аргументом — то, на что будет заменяться.
Также есть третий, опциональный, аргумент, который отвечает за то, сколько раз вы хотите заменить старую подстроку на новую. По умолчанию, все вхождения заменяются.
#строки
Создаем пакеты
Пакет в Python — это, грубо говоря, папка с другими папками и модулями. Помимо разделения частей проекта, пакеты нужны для формирования пространства имен, чтобы можно работать с пакетами и модулями через точку, как в примере выше.
При импорте вида
Также примечателен файл init.py, который раньше был обязателен для создания пакетов. С версии Python 3.3 его необходимость пропала. Однако его функциональность на этом не заканчиваются.
#модули #пакеты
Пакет в Python — это, грубо говоря, папка с другими папками и модулями. Помимо разделения частей проекта, пакеты нужны для формирования пространства имен, чтобы можно работать с пакетами и модулями через точку, как в примере выше.
При импорте вида
from package import *
будет подключены либо все модули и объекты модуля __init__.py
, либо то, что находится в переменной __all__
в том же модуле __init__.py
— подробнее про эту переменную было в посте ранее.Также примечателен файл init.py, который раньше был обязателен для создания пакетов. С версии Python 3.3 его необходимость пропала. Однако его функциональность на этом не заканчиваются.
#модули #пакеты
Создаем виртуальное окружение
Виртуальное окружение — это изолированная среда, которая имеет свои локальные интерпретатор и пакеты, независимые от глобального интерпретатора и других окружений.
В стандартной библиотеке Python третьей версии есть пакет
Скрипт
В случае успешного создания и активации у вас в терминале должно появится название вашего виртуального окружения в круглых скобках.
#venv
Виртуальное окружение — это изолированная среда, которая имеет свои локальные интерпретатор и пакеты, независимые от глобального интерпретатора и других окружений.
В стандартной библиотеке Python третьей версии есть пакет
venv
, который позволяет создавать виртуальные окружения удобно и быстро. Пример представлен на картинке. Скрипт
activate
в директории bin
предназначен для активации окружения, а команда deactivate
в уже активированном окружении — для выхода из него.В случае успешного создания и активации у вас в терминале должно появится название вашего виртуального окружения в круглых скобках.
#venv
ORM для PostgreSQl и SQlite3
ViBranium — это ORM, которая умеет работать с базами данных PostgreSQl и SQlite3. Помимо функционала для работы с бд, в пакете также есть удобные модули для логирования и шифрования.
А поскольку далеко не все данные следует хранить в чистом виде, вы можете пропустить их через хеш-функции с помощью класса Encrypt, который есть внутри ViBranium.
Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
ViBranium — это ORM, которая умеет работать с базами данных PostgreSQl и SQlite3. Помимо функционала для работы с бд, в пакете также есть удобные модули для логирования и шифрования.
А поскольку далеко не все данные следует хранить в чистом виде, вы можете пропустить их через хеш-функции с помощью класса Encrypt, который есть внутри ViBranium.
Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
Статические методы
Отличие статических методов от обычных в том, что они привязаны к классу, а не объекту. То есть они могут быть вызваны напрямую у класса.
Статический метод не принимает ни объект (
Реализовать статический метод можно двумя способами. Один из них — присвоить классу новый метод, напрямую передав изначальный метод в функцию
Но так делать не принято, поэтому чаще всего
#staticmethod
Отличие статических методов от обычных в том, что они привязаны к классу, а не объекту. То есть они могут быть вызваны напрямую у класса.
Статический метод не принимает ни объект (
self
), ни класс (cls
) в аргументах. То есть такие методы не могут модифицировать ни объект, ни сам класс. Реализовать статический метод можно двумя способами. Один из них — присвоить классу новый метод, напрямую передав изначальный метод в функцию
staticmethod
. Но так делать не принято, поэтому чаще всего
staticmethod
используют в качестве декоратора при написании методов прямо в классе. #staticmethod
Находим наименьшие и наибольшие
В стандартной библиотеке есть модуль
Особенности и пользу этой структуры данных пока что разбирать не будем, но посмотрим на два интересных метода в этом модуле.
С помощью методов
Первым аргументов передается, сколько элементов нужно взять, вторым — список.
#heap
В стандартной библиотеке есть модуль
heapq
, который, как можно понять по названию, реализует структуру даных куча.Особенности и пользу этой структуры данных пока что разбирать не будем, но посмотрим на два интересных метода в этом модуле.
С помощью методов
nsmallest
и nlargest
можно получить наименьшие и наибольшие элементы в списке. Первым аргументов передается, сколько элементов нужно взять, вторым — список.
#heap
Получаем информацию о памяти на диске
Со встроенным модулем
Но с помощью
Так как все три значения возвращаются в байтах, в примере мы их перевели и вывели в гигабайты для лучшей наглядности.
#shutil
Со встроенным модулем
shutil
многие уже, вероятно, знакомы, но его обычно используют в контексте задач копирования, переноса файлов и папок.Но с помощью
shutil
мы можем даже получить информацию о памяти на жестком диске компьютера. Метод disk_usage
возвращает количество всей, занятой и свободной памяти.Так как все три значения возвращаются в байтах, в примере мы их перевели и вывели в гигабайты для лучшей наглядности.
#shutil
Списковые включения
На основе итерируемых объектов можно удобно и без циклов строить списки в одну строчку — такой синтаксис называется списковыми включениями.
Сейчас подробнее разберем именно списки, но по такому же принципу можно создавать и словари.
В квадратных скобках вы пишите самую обычную конструкцию цикла
Как правило, списковые включения работают заметно быстрее, чем циклы. Однако, злоупотреблять этим не рекомендуется, так как это зачастую снижает читаемость кода.
#списки #словари
На основе итерируемых объектов можно удобно и без циклов строить списки в одну строчку — такой синтаксис называется списковыми включениями.
Сейчас подробнее разберем именно списки, но по такому же принципу можно создавать и словари.
В квадратных скобках вы пишите самую обычную конструкцию цикла
for
, но само выражение ставите перед ключевым словом for
. Также можно добавлять условия в конце записи.Как правило, списковые включения работают заметно быстрее, чем циклы. Однако, злоупотреблять этим не рекомендуется, так как это зачастую снижает читаемость кода.
#списки #словари
Время исполнения программы
Зачастую требуется замерить время исполнения кода, чтобы понять, насколько оптимальное решение было выбрано.
Как вариант, можно воспользоваться функцией
Перед исполнением нашего кода сохраним начальное время, а после — конечное. Путем вычета первого из второго и получим время исполнения программы.
Использование
#time
Зачастую требуется замерить время исполнения кода, чтобы понять, насколько оптимальное решение было выбрано.
Как вариант, можно воспользоваться функцией
time
из модуля time
, которая возвращает текущее время в формате Unix.Перед исполнением нашего кода сохраним начальное время, а после — конечное. Путем вычета первого из второго и получим время исполнения программы.
Использование
time.time()
— не самый точный и лучший вариант, но, например, для быстрого сравнения двух разных частей кода подходит хорошо.#time
Получаем информацию по IP
Недавно наткнулся на интересный пакет
Метод
Атрибуты
#ip
Недавно наткнулся на интересный пакет
ip2geotools
, с помощью которого можно получить геолокацию по IP из нескольких баз данных. Устанавливается он через пакетный менеджер pip
. Метод
get
из класса DbIpCity
, который представляет некоммерческую базу данных, позволяет получить всю необходимую информацию по желаемому IP бесплатно. Атрибуты
city
, region
, country
хранят в себе информацию о городе, регионе и стране. А обратившись к атрибутам latitude
и longitude
можно получить широту и долготу. #ip
Защищаем исходный код обфускацией
Обфускация кода — это превращение исходного кода в нечитаемый для человека вид, при этом сохраняя всю функциональность программы.
Цель подобных действий заключается в защите скриптов. Обфускация делает анализ кода крайне сложным, а иногда и невозможным.
Таким образом, другим разработчикам становится проблематично получить и понять ваш исходный код для того, чтобы, например, взломать программу.
В Python есть отличная библиотека
#pyarmor
Обфускация кода — это превращение исходного кода в нечитаемый для человека вид, при этом сохраняя всю функциональность программы.
Цель подобных действий заключается в защите скриптов. Обфускация делает анализ кода крайне сложным, а иногда и невозможным.
Таким образом, другим разработчикам становится проблематично получить и понять ваш исходный код для того, чтобы, например, взломать программу.
В Python есть отличная библиотека
pyarmor
, предназначенная именно для этого. Пример использования этого пакета в терминале представлен выше на картинке. #pyarmor
Превращаем текст в речь
На Python есть классная библиотека
При создании экземпляра класса
Сохранить полученный результат можно с помощью метода
#gtts
На Python есть классная библиотека
gTTS
(Google Text-to-Speech), которая взаимодействует с Google Translate's text-to-speech API и позволяет делать из текста аудиофайлы. Пакет как всегда устанавливается через pip
. При создании экземпляра класса
gTTS
мы передаем исходный текст первым аргументом. Также можно передать опциональный аргумент, отвечающий за язык, который по умолчанию является английским. Сохранить полученный результат можно с помощью метода
save
, в который передаем название файла. #gtts
Используйте dict.get() вместо dict[]
Есть несколько способов получения значений из словарей, и даже по такой теме разработчики часто спорят.
Многие получают значения по ключам через квадратные скобки, но если такого ключа нет, то будет вызвано исключение.
Поэтому мы считаем, что лучше использовать метод
Таким образом, если значение по ключу не найдено, то вернется дефолтное значение.
В итоге, мы убираем возможные ошибки в случае, если нужных ключей в словаре нет.
#словари
Есть несколько способов получения значений из словарей, и даже по такой теме разработчики часто спорят.
Многие получают значения по ключам через квадратные скобки, но если такого ключа нет, то будет вызвано исключение.
Поэтому мы считаем, что лучше использовать метод
get
у словарей. Его основной плюс заключается в том, что он принимает опциональный аргумент, отвечающий за значение по умолчанию. Таким образом, если значение по ключу не найдено, то вернется дефолтное значение.
В итоге, мы убираем возможные ошибки в случае, если нужных ключей в словаре нет.
#словари
Сортировка списков
В Python есть два встроенных способа для сортировки списков — функция
Функция
Метод
#списки
В Python есть два встроенных способа для сортировки списков — функция
sorted()
и метод list.sort()
. Результат в обоих случаях одинаков, но всё же есть нюансы. Функция
sorted()
принимает на вход аргумент в виде списка, а возвращает уже новый, отсортированный список. При этом исходный список не изменяется. Метод
sort()
в свою очередь применяется к списку, изменяет его непосредственно и ничего не возвращает.#списки
Форматируем строку для URL-адреса
Для начала стоит вспомнить, что слаг (slug) — это уникальная строка-идентификатор, понятная человеку и содержащая только "безопасные" символы: латинские символы в нижнем регистре, цифры и дефис.
Чаще всего такое понятие можно встретить в контексте URL-адресов. Например, можно формировать слаг из названия какой-нибудь статьи и вставлять его в ссылку, чтобы людям было понятно, куда они переходят.
Выше в коде мы написали простую функцию, где использовали методы
Также для удаления некоторых символов и замены на знак дефиса были использованы регулярные выражения и встроенный пакет
#строки #re
Для начала стоит вспомнить, что слаг (slug) — это уникальная строка-идентификатор, понятная человеку и содержащая только "безопасные" символы: латинские символы в нижнем регистре, цифры и дефис.
Чаще всего такое понятие можно встретить в контексте URL-адресов. Например, можно формировать слаг из названия какой-нибудь статьи и вставлять его в ссылку, чтобы людям было понятно, куда они переходят.
Выше в коде мы написали простую функцию, где использовали методы
lower()
для приведения в нижний регистр и strip()
для удаления пробелов слева и справа. Также для удаления некоторых символов и замены на знак дефиса были использованы регулярные выражения и встроенный пакет
re
для работы с ними. #строки #re