Привет! С вами Иван, и сегодня мы разберёмся с созданием собственных Python-пакетов для повторного использования кода c помощью
## Почему это важно?
Рано или поздно каждый сталкивается с ситуацией: вот отличная функция для обработки даты, и вот она снова нужна — в новом проекте. Перетаскивать файлы вручную – прошлый век! Пакеты решают эту проблему. Помимо удобства, это ещё и первый шаг к публикации в PyPI.
## Минимальный пакет: поехали!
Для примера создадим папку
Теперь создадим файл
Скелет готов!
## Настраиваем setup.py
Теперь самая магия —
## Установка пакета
Перейдите в папку выше и установите пакет локально:
Флаг
## Используем в реальном коде
Готово! Теперь можно импортировать функции из любого места:
## Итоги
Создавать свои пакеты с помощью
setuptools
. Терпеть не могу копировать функции из одного проекта в другой! К счастью, Python позволяет упаковать полезные модули, чтобы потом легко их устанавливать через pip.## Почему это важно?
Рано или поздно каждый сталкивается с ситуацией: вот отличная функция для обработки даты, и вот она снова нужна — в новом проекте. Перетаскивать файлы вручную – прошлый век! Пакеты решают эту проблему. Помимо удобства, это ещё и первый шаг к публикации в PyPI.
## Минимальный пакет: поехали!
Для примера создадим папку
awesome_math
, а внутри — файл operations.py
:# operations.py
def add(a, b):
return a + b
def multiply(a, b):
return a * b
Теперь создадим файл
__init__.py
(даже если он пустой):# __init__.py
from .operations import add, multiply
Скелет готов!
## Настраиваем setup.py
Теперь самая магия —
setup.py
:from setuptools import setup, find_packages
setup(
name="awesome_math",
version="0.1",
packages=find_packages(),
author="Ivan",
description="Sample package for math operations",
python_requires=">=3.6",
)
## Установка пакета
Перейдите в папку выше и установите пакет локально:
pip install -e ./awesome_math
Флаг
-e
(“editable”) позволяет менять код пакета на лету — удобно для отладки.## Используем в реальном коде
Готово! Теперь можно импортировать функции из любого места:
from awesome_math import add, multiply
print(add(2, 3)) # 5
print(multiply(4, 5)) # 20
## Итоги
Создавать свои пакеты с помощью
setuptools
— просто и удобно. Такой подход организует код, ускоряет разработку и позволяет делиться своими наработками с коллегами (или со всем миром!). Я всегда советую автоматизировать повторяющиеся задачи, а свой пакет — лучший способ избавиться от рутины.👍1
Привет! С вами Иван, и сегодня мы разберём одну из самых неоднозначных истин программиста: унаследованный код и сторонние библиотеки — это не враги, а будущие союзники!
Когда впервые сталкиваешься с чужими проектами или старыми библиотеками, кажется, будто попал в таинственный квест без карты. Однако Python предоставляет инструменты, чтобы не только "выжить" среди многолетних конструкций, но и укротить их под свои нужды.
### Исследуем незнакомый код
Для начала важно быстро понять структуру чужой библиотеки. Поможет модуль
Этот фрагмент выведет все функции модуля
### Переосмысливаем поведение
Допустим, сторонняя функция работает не совсем так, как хочется. На помощь приходит паттерн "обертки":
Такой подход добавляет нужную проверку, не трогая оригинал.
### Замена или расширение классов
Наследуемый класс хранит логику, которую вы бы немного изменили? Подклассируете!
Теперь старый функционал расширен без потери совместимости.
### Отладка без стресса
Модуль
Логи позволяют действовать осознанно, даже если документация минимальна.
### Важный совет от Ивана
Не бойтесь экспериментировать с чужим кодом (только не в продакшене!). Модули
До встречи в следующих коротких, но ёмких разборках!
Когда впервые сталкиваешься с чужими проектами или старыми библиотеками, кажется, будто попал в таинственный квест без карты. Однако Python предоставляет инструменты, чтобы не только "выжить" среди многолетних конструкций, но и укротить их под свои нужды.
### Исследуем незнакомый код
Для начала важно быстро понять структуру чужой библиотеки. Поможет модуль
inspect
:import inspect
import math
print(inspect.getmembers(math, inspect.isfunction))
Этот фрагмент выведет все функции модуля
math
. Так вы сразу увидите, чем можно воспользоваться, не лезя в исходники.### Переосмысливаем поведение
Допустим, сторонняя функция работает не совсем так, как хочется. На помощь приходит паттерн "обертки":
from some_old_library import too_simple_func
def my_func(*args, **kwargs):
result = too_simple_func(*args, **kwargs)
if result is None:
raise ValueError("Это слишком просто!")
return result
Такой подход добавляет нужную проверку, не трогая оригинал.
### Замена или расширение классов
Наследуемый класс хранит логику, которую вы бы немного изменили? Подклассируете!
from legacy_package import OldClass
class NewClass(OldClass):
def calculate(self, x):
result = super().calculate(x)
return result * 2
Теперь старый функционал расширен без потери совместимости.
### Отладка без стресса
Модуль
logging
помогает понять, что происходит внутри:import logging
logging.basicConfig(level=logging.DEBUG)
def wrapped_func(*args):
logging.debug("Arguments: %s", args)
return too_simple_func(*args)
Логи позволяют действовать осознанно, даже если документация минимальна.
### Важный совет от Ивана
Не бойтесь экспериментировать с чужим кодом (только не в продакшене!). Модули
inspect
, unittest.mock
, обертки и наследование — ваши друзья. С их помощью даже ветхое наследие превратится в прочную базу для новых идей.До встречи в следующих коротких, но ёмких разборках!
👍1
# Автоматизация запуска Python-приложений с PyInstaller
Привет! С вами Иван, и сегодня мы разберём, как сделать запуск ваших Python-приложений быстрым, удобным и "по-взрослому" — одним двойным кликом по файлу. Если вы только начинаете путь в программировании, тема создания исполняемых файлов (.exe на Windows) будет настоящим открытием!
## Для чего нужен PyInstaller?
Когда ваш скрипт готов, часто хочется поделиться им с друзьями или коллегами, которые не знают, что такое Python и как его ставить. Вместо долгих объяснений, как запускать
PyInstaller превращает ваш Python-код (и все нужные ему библиотеки) в исполняемый файл. Такой файл легко запускать без всяких интерпретаторов и сложно объяснить случайным пользователям, почему по папке не разбросаны всякие .py, .pyc и директории.
## Первое знакомство: Простой пример
Для начала установим PyInstaller:
Допустим, у вас есть файл
Соберём из него исполняемый файл:
С ключом
## Немного креатива: Сохраним иконку и сделаем автозапуск
Вы хотите, чтобы приложение выглядело красивее? Добавьте свою иконку — достаточно добавить флаг:
А чтобы программа запускалась автоматически при старте системы (например, генерирует полезный отчёт каждое утро), создайте ярлык в папке автозагрузки Windows:
## Обработка ресурсов
PyInstaller поддерживает включение любых необходимых файлов (картинок, настроек и т.п.):
## Итог
PyInstaller — отличный инструмент для тех, кто хочет делиться своими проектами без лишней головной боли: собрай, передай файл, и всё работает у любого пользователя. Попробуйте автоматизировать сборку и запуск уже сегодня!
Привет! С вами Иван, и сегодня мы разберём, как сделать запуск ваших Python-приложений быстрым, удобным и "по-взрослому" — одним двойным кликом по файлу. Если вы только начинаете путь в программировании, тема создания исполняемых файлов (.exe на Windows) будет настоящим открытием!
## Для чего нужен PyInstaller?
Когда ваш скрипт готов, часто хочется поделиться им с друзьями или коллегами, которые не знают, что такое Python и как его ставить. Вместо долгих объяснений, как запускать
.py
файлы, можно собрать из них самостоятельную программу.PyInstaller превращает ваш Python-код (и все нужные ему библиотеки) в исполняемый файл. Такой файл легко запускать без всяких интерпретаторов и сложно объяснить случайным пользователям, почему по папке не разбросаны всякие .py, .pyc и директории.
## Первое знакомство: Простой пример
Для начала установим PyInstaller:
pip install pyinstaller
Допустим, у вас есть файл
hello.py
:def main():
print("Hello, world!")
if __name__ == "__main__":
main()
Соберём из него исполняемый файл:
pyinstaller --onefile hello.py
С ключом
--onefile
все собирается в один .exe
. На выходе получите папку dist/
, где и будет ваш долгожданный исполняемый файл.## Немного креатива: Сохраним иконку и сделаем автозапуск
Вы хотите, чтобы приложение выглядело красивее? Добавьте свою иконку — достаточно добавить флаг:
pyinstaller --onefile --icon=myicon.ico hello.py
А чтобы программа запускалась автоматически при старте системы (например, генерирует полезный отчёт каждое утро), создайте ярлык в папке автозагрузки Windows:
import os
import shutil
startup_dir = os.path.join(os.environ["APPDATA"], "Microsoft", "Windows", "Start Menu", "Programs", "Startup")
shutil.copy("dist/hello.exe", os.path.join(startup_dir, "hello.exe"))
## Обработка ресурсов
PyInstaller поддерживает включение любых необходимых файлов (картинок, настроек и т.п.):
pyinstaller --onefile --add-data "config.yaml;."
## Итог
PyInstaller — отличный инструмент для тех, кто хочет делиться своими проектами без лишней головной боли: собрай, передай файл, и всё работает у любого пользователя. Попробуйте автоматизировать сборку и запуск уже сегодня!
❤2🔥1
Привет, друзья! С вами Иван — разгадываем тайны Python каждый день. Сегодня расскажу про отличный инструмент для работы с XML — модуль
### Как вообще устроен ElementTree?
XML — это способ хранить структурированные данные. Представьте себе дерево: корень, ветви, листья. Модуль
#### Пример 1: Чтение XML
Давайте начнем с простого XML:
Как это прочитать?
Вот так просто вытаскиваем все страны и города. Бесплатный бонус —
#### Пример 2: Создание XML “с нуля”
А если надо создать свой XML? Не проблема:
XML-файл готов, структура соблюдена. Заметьте, вместо длинной “ручной” генерации строк — всё строится как дерево объектов.
#### Пример 3: Модификация XML
Надо отредактировать файл? Например, добавить новую книгу:
Новое знание — добавлено!
### Особенности и ограничения
-
- Для громоздких и сложных XML ищите что-то “потяжелее” (например, lxml).
Модуль
xml.etree.ElementTree
. Это встроенная библиотека Python, которая позволяет парсить, создавать и модифицировать XML-файлы, не нагружая мозг лишней сложностью.### Как вообще устроен ElementTree?
XML — это способ хранить структурированные данные. Представьте себе дерево: корень, ветви, листья. Модуль
ElementTree
как раз позволяет “гулять” по этому дереву.#### Пример 1: Чтение XML
Давайте начнем с простого XML:
<data>
<country name="Russia">
<city>Москва</city>
<city>Санкт-Петербург</city>
</country>
<country name="USA">
<city>New York</city>
<city>Los Angeles</city>
</country>
</data>
Как это прочитать?
import xml.etree.ElementTree as ET
tree = ET.parse('countries.xml')
root = tree.getroot()
for country in root.findall('country'):
name = country.get('name')
print('Country:', name)
for city in country.findall('city'):
print(' City:', city.text)
Вот так просто вытаскиваем все страны и города. Бесплатный бонус —
.findall()
возвращает подэлементы, а .get()
помогает доставать значения атрибутов.#### Пример 2: Создание XML “с нуля”
А если надо создать свой XML? Не проблема:
import xml.etree.ElementTree as ET
root = ET.Element('library')
book1 = ET.SubElement(root, 'book', title='Python 101')
book2 = ET.SubElement(root, 'book', title='Deep Learning')
ET.SubElement(book1, 'author').text = 'Ivan Petrov'
ET.SubElement(book2, 'author').text = 'Anna Smith'
tree = ET.ElementTree(root)
tree.write('library.xml', encoding='utf-8', xml_declaration=True)
XML-файл готов, структура соблюдена. Заметьте, вместо длинной “ручной” генерации строк — всё строится как дерево объектов.
#### Пример 3: Модификация XML
Надо отредактировать файл? Например, добавить новую книгу:
import xml.etree.ElementTree as ET
tree = ET.parse('library.xml')
root = tree.getroot()
new_book = ET.SubElement(root, 'book', title='Fluent Python')
ET.SubElement(new_book, 'author').text = 'Luciano Ramalho'
tree.write('library.xml', encoding='utf-8', xml_declaration=True)
Новое знание — добавлено!
### Особенности и ограничения
-
ElementTree
хорош для быстрого старта, но не поддерживает XPath на полную катушку и не валидирует XML.- Для громоздких и сложных XML ищите что-то “потяжелее” (например, lxml).
Модуль
xml.etree.ElementTree
— оптимальный старт для тех, кто начал изучать работу с XML на Python. Код читается легко, ошибок — минимум, всё как мы любим!👍2
Привет! С вами Иван, и сегодня у нас на повестке — асинхронные итераторы и асинхронные контекстные менеджеры в Python. Эти инструменты — не только про «магические» async и await, они воплощают суть современной асинхронности: элегантный контроль над ресурсами и процессами в неблокирующем стиле. Давайте разберёмся по полочкам!
### Асинхронные итераторы
Асинхронный итератор — это объект, который поддерживает метод
Вот пример простейшего своего асинхронного итератора:
Асинхронные итераторы блестяще подходят, если вы хотите, чтобы программа не простаивала в ожидании внешних данных, а занималась другими делами.
### Асинхронные контекстные менеджеры
А теперь представьте ситуацию: для работы с внешним ресурсом (например, подключение к БД или файлу) вам нужен асинхронный код. Здесь появляются асинхронные контекстные менеджеры (
Пример на основе таймера:
Такой подход поможет безопасно выделять и освобождать ресурсы даже в асинхронных задачах. Асинхронные менеджеры активно используют библиотеки aiohttp, aiomysql и другие современные async-инструменты.
### Итог
Асинхронные итераторы и асинхронные контекстные менеджеры — это две стороны одной монеты: грамотное и безопасное управление асинхронными процессами. Освоив их, вы сможете писать «живые» и эффективные приложения, не жертвуя структурой и чистотой кода.
В следующий раз разберём, где на практике искать и как использовать готовые асинхронные инструменты в популярных библиотеках!
### Асинхронные итераторы
Асинхронный итератор — это объект, который поддерживает метод
__anext__
и интерфейс __aiter__
, а работать с ним можно через async for
. Обычно они нужны, если вы хотите итерироваться по данным, загружаемым с задержками: например, получать ответы от API по мере их поступления.Вот пример простейшего своего асинхронного итератора:
class AsyncCounter:
def __init__(self, start, end):
self.current = start
self.end = end
def __aiter__(self):
return self
async def __anext__(self):
if self.current >= self.end:
raise StopAsyncIteration
await asyncio.sleep(0.5) # имитация задержки
self.current += 1
return self.current - 1
import asyncio
async def main():
async for number in AsyncCounter(0, 3):
print(number)
asyncio.run(main())
Асинхронные итераторы блестяще подходят, если вы хотите, чтобы программа не простаивала в ожидании внешних данных, а занималась другими делами.
### Асинхронные контекстные менеджеры
А теперь представьте ситуацию: для работы с внешним ресурсом (например, подключение к БД или файлу) вам нужен асинхронный код. Здесь появляются асинхронные контекстные менеджеры (
async with
), которые реализуют методы __aenter__
и __aexit__
.Пример на основе таймера:
class AsyncTimer:
async def __aenter__(self):
self.start = asyncio.get_event_loop().time()
return self
async def __aexit__(self, exc_type, exc, tb):
end = asyncio.get_event_loop().time()
print(f'Duration: {end - self.start:.2f} seconds')
import asyncio
async def do_work():
await asyncio.sleep(1)
async def main():
async with AsyncTimer():
await do_work()
asyncio.run(main())
Такой подход поможет безопасно выделять и освобождать ресурсы даже в асинхронных задачах. Асинхронные менеджеры активно используют библиотеки aiohttp, aiomysql и другие современные async-инструменты.
### Итог
Асинхронные итераторы и асинхронные контекстные менеджеры — это две стороны одной монеты: грамотное и безопасное управление асинхронными процессами. Освоив их, вы сможете писать «живые» и эффективные приложения, не жертвуя структурой и чистотой кода.
В следующий раз разберём, где на практике искать и как использовать готовые асинхронные инструменты в популярных библиотеках!
👍1
Привет! На связи Иван, и сегодня поговорим о том, как заставить ваш ноутбук работать за троих (или даже десятерых) с помощью Python! Тема выпуска — библиотека joblib и ее простые способы организовать параллельные вычисления.
Постой, зачем мне параллельные вычисления?
Очень просто: если у вас есть повторяющиеся задачи, которые не зависят друг от друга, — например, обработка большого списка изображений или вычисления для разных наборов данных — их можно запускать одновременно. Это ускорит работу почти в разы, особенно на многоядерных процессорах.
Почему joblib, а не стандартный multiprocessing?
joblib проще! Фактически, она создана для тех случаев, когда нужно параллелить обработку данных, начиная от простых циклов до длительных вычислений в Data Science и ML.
Минимальный пример:
Допустим, у нас есть функция, вычисляющая сумму квадратов для заданного числа, и список чисел.
-
-
Фишка с joblib:
joblib сам заботится о создании процессов. Просто говорите, сколько “работников” (
Параллельная обработка файлов:
Когда joblib особенно полезна?
- При работе с большими наборами данных.
- Для ускорения преобразований в циклах.
- Для сложных аналитических вычислений.
joblib также отлично “дружит” с библиотеками для машинного обучения, например, scikit-learn, в котором многие функции используют joblib внутри!
Попробуйте joblib, если хочется ускорить рутинные задачи и “разогнать” свои вычисления за пару строк кода!
Постой, зачем мне параллельные вычисления?
Очень просто: если у вас есть повторяющиеся задачи, которые не зависят друг от друга, — например, обработка большого списка изображений или вычисления для разных наборов данных — их можно запускать одновременно. Это ускорит работу почти в разы, особенно на многоядерных процессорах.
Почему joblib, а не стандартный multiprocessing?
joblib проще! Фактически, она создана для тех случаев, когда нужно параллелить обработку данных, начиная от простых циклов до длительных вычислений в Data Science и ML.
Минимальный пример:
Допустим, у нас есть функция, вычисляющая сумму квадратов для заданного числа, и список чисел.
from joblib import Parallel, delayed
def calc_square_sum(n):
return sum(i * i for i in range(n))
numbers = [10**6, 2 * 10**6, 3 * 10**6, 4 * 10**6]
results = Parallel(n_jobs=2)(delayed(calc_square_sum)(n) for n in numbers)
print(results)
-
Parallel(n_jobs=2)
— запускаем два параллельных процесса.-
delayed(calc_square_sum)(n)
— “оборачиваем” функцию, чтобы она запускалась параллельно для каждого n
.Фишка с joblib:
joblib сам заботится о создании процессов. Просто говорите, сколько “работников” (
n_jobs
) хотите, и библиотека запустит задачи параллельно.Параллельная обработка файлов:
import os
from joblib import Parallel, delayed
def process_file(filename):
# Тут могут быть чтение, обработка, парсинг и т.п.
return os.path.getsize(filename)
file_list = ['file1.txt', 'file2.txt', 'file3.txt']
sizes = Parallel(n_jobs=3)(delayed(process_file)(fname) for fname in file_list)
print(sizes)
Когда joblib особенно полезна?
- При работе с большими наборами данных.
- Для ускорения преобразований в циклах.
- Для сложных аналитических вычислений.
joblib также отлично “дружит” с библиотеками для машинного обучения, например, scikit-learn, в котором многие функции используют joblib внутри!
Попробуйте joblib, если хочется ускорить рутинные задачи и “разогнать” свои вычисления за пару строк кода!
👍1
Привет! Меня зовут Иван, и сегодня мы разберём одну из самых недооценённых суперспособностей Python — структурированное логирование! Если вы уже сталкивались с модулем logging, но всегда ограничивались парой строчек для отладки, пришло время поднять левел вашего кода.
### Зачем вообще нужен logging?
Стандартный модуль logging позволяет не просто печатать информацию для “себя” в отладочных целях, а организовать работу вашего приложения так, чтобы логи были читаемыми, информативными и пригодными для автоматической обработки. Это особенно важно, если проект растёт, а в команде появляется ещё кто-то кроме вас.
### Быстрая стартовая конфигурация
Давайте сравним простую запись через
Казалось бы, разница невелика. Но давайте добавим структуру!
### Форматируем логи под свои нужды
С помощью
Теперь в логе — время, уровень сообщения, имя логгера, текст. Попробуйте добавить имя модуля или, например, идентификатор пользователя.
### Структурирование через дополнительный контекст
Ценность логирования растёт, когда можно структурировать данные: например, выводить идентификаторы заказов, пользователей и даже JSON.
Чтобы extra-данные появились в выводе, их нужно добавить в формат:
### Логирование в JSON (ещё шаг к структуре)
Используя сторонние библиотеки типа
### Вывод
Структурированное логирование позволит не теряться в море сообщений даже в большом проекте: вы сможете сортировать, фильтровать и анализировать свои логи как профи. Не ограничивайтесь print’ом — знакомьтесь с logging поближе, и ваши проекты станут на порядок “взрослее”!
Ваш Иван.
### Зачем вообще нужен logging?
Стандартный модуль logging позволяет не просто печатать информацию для “себя” в отладочных целях, а организовать работу вашего приложения так, чтобы логи были читаемыми, информативными и пригодными для автоматической обработки. Это особенно важно, если проект растёт, а в команде появляется ещё кто-то кроме вас.
### Быстрая стартовая конфигурация
Давайте сравним простую запись через
print()
и использование logging:import logging
logging.basicConfig(level=logging.INFO)
logging.info("User logged in")
Казалось бы, разница невелика. Но давайте добавим структуру!
### Форматируем логи под свои нужды
С помощью
format
можно задать, что и как выводить:import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(name)s — %(message)s'
)
logging.info("Processing data...")
Теперь в логе — время, уровень сообщения, имя логгера, текст. Попробуйте добавить имя модуля или, например, идентификатор пользователя.
### Структурирование через дополнительный контекст
Ценность логирования растёт, когда можно структурировать данные: например, выводить идентификаторы заказов, пользователей и даже JSON.
import logging
logger = logging.getLogger("auth")
extra_info = {'user_id': 123, 'ip': '192.168.0.1'}
logger.info("Login attempt", extra=extra_info)
Чтобы extra-данные появились в выводе, их нужно добавить в формат:
logging.basicConfig(
format='%(asctime)s [%(levelname)s] %(name)s — %(message)s [User: %(user_id)s IP: %(ip)s]'
)
### Логирование в JSON (ещё шаг к структуре)
Используя сторонние библиотеки типа
python-json-logger
, формат можно сделать пригодным для автоматической обработки:from pythonjsonlogger import jsonlogger
import logging
handler = logging.StreamHandler()
formatter = jsonlogger.JsonFormatter()
handler.setFormatter(formatter)
logger = logging.getLogger("myjsonlogger")
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logger.info("Event processed", extra={'event_id': 555, 'status': 'success'})
### Вывод
Структурированное логирование позволит не теряться в море сообщений даже в большом проекте: вы сможете сортировать, фильтровать и анализировать свои логи как профи. Не ограничивайтесь print’ом — знакомьтесь с logging поближе, и ваши проекты станут на порядок “взрослее”!
Ваш Иван.
👍2
Привет, на связи Иван! Сегодня поговорим о магии управления транзакциями с помощью SQLAlchemy — универсального инструмента для работы с базами данных в Python.
Что такое транзакция и зачем она нужна?
Представьте, что вы обрабатываете банковский перевод: списываете деньги у одного пользователя и начисляете их другому. Что, если в середине операции отключится свет? Важно, чтобы операция либо завершилась полностью, либо не была выполнена вовсе. Здесь и вступают в игру транзакции!
SQLAlchemy не только помогает строить запросы к базе «на лету», но и позволяет контролировать целостность данных через механизмы управления транзакциями.
### Пример 1: Автоматическое управление транзакциями
Всё просто: используем контекстный менеджер
### Пример 2: Ручной контроль — commit и rollback
Иногда нужно больше контроля, например, при сложной логике:
### Преимущества
- Надежность: можно быть уверенным, что данные не останутся в «полусыром» состоянии.
- Удобство: Pythonic API и защита от ошибок.
- Гибкость: поддержка разных СУБД (PostgreSQL, SQLite, MySQL и др.).
SQLAlchemy превращает работу с транзакциями во вполне дружелюбное и безопасное занятие. Теперь вы знаете, как избегать неожиданных неприятностей при работе с базами данных на Python. Попробуйте — понравится!
Что такое транзакция и зачем она нужна?
Представьте, что вы обрабатываете банковский перевод: списываете деньги у одного пользователя и начисляете их другому. Что, если в середине операции отключится свет? Важно, чтобы операция либо завершилась полностью, либо не была выполнена вовсе. Здесь и вступают в игру транзакции!
SQLAlchemy не только помогает строить запросы к базе «на лету», но и позволяет контролировать целостность данных через механизмы управления транзакциями.
### Пример 1: Автоматическое управление транзакциями
Всё просто: используем контекстный менеджер
session.begin()
. Если внутри блока возникает исключение — все изменения автоматом откатываются.from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
with session.begin():
new_user = User(name='Alice')
session.add(new_user)
# Закоммитили — пользователь добавлен!
### Пример 2: Ручной контроль — commit и rollback
Иногда нужно больше контроля, например, при сложной логике:
with Session(engine) as session:
try:
user1 = User(name='Bob')
session.add(user1)
# Какая-то логика, возможно, с ошибкой
if user1.name == 'Bob':
raise ValueError("Test error!")
session.commit()
except Exception:
session.rollback()
print("Транзакция отменена, все изменения откатились.")
### Преимущества
- Надежность: можно быть уверенным, что данные не останутся в «полусыром» состоянии.
- Удобство: Pythonic API и защита от ошибок.
- Гибкость: поддержка разных СУБД (PostgreSQL, SQLite, MySQL и др.).
SQLAlchemy превращает работу с транзакциями во вполне дружелюбное и безопасное занятие. Теперь вы знаете, как избегать неожиданных неприятностей при работе с базами данных на Python. Попробуйте — понравится!
👍1
Привет! На связи Иван. Сегодня разберём, как добавить возможность обработки изображений в ваше Python-веб-приложение. Это реальный must-have, если вы хотите, чтобы пользователи могли загружать фото и редактировать их прямо в браузере.
Модули, которые нам пригодятся — это
## Установка
Установим нужные библиотеки:
## Базовое приложение, принимающее изображение
Сначала напишем простейший сервер:
## Как это работает?
1. Пользователь отправляет картинку на
2. Сервер открывает изображение с помощью Pillow.
3. Обрабатывает изображение (здесь — поворот на 90 градусов).
4. Возвращает обработанный файл пользователю.
## Немного больше магии
А вот как сделать превью картинки:
А если хотите фильтр «чёрно-белое фото» — это одна строчка:
## Как попробовать?
Можно использовать Postman или curl:
## Краткие советы
- Всегда проверяйте формат изображения!
- Защитите приложение от загрузки слишком больших файлов.
- Pillow поддерживает кучу фильтров и манипуляций: кадрирование, размытие, изменение яркости и многое другое.
Обработка изображений в веб-приложениях на Python — вопрос пары строчек кода. Главное — фантазия и понимание, как устроен ваш стек. Экспериментируйте, и пусть ваше приложение станет стильнее и удобнее!
До встречи,
Иван
Модули, которые нам пригодятся — это
Flask
для сервера и легендарный Pillow
для обработки изображений. Да, всё проще, чем кажется! ## Установка
Установим нужные библиотеки:
pip install flask pillow
## Базовое приложение, принимающее изображение
Сначала напишем простейший сервер:
from flask import Flask, request, send_file
from PIL import Image
import io
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def process_image():
if 'file' not in request.files:
return "No file uploaded", 400
img_file = request.files['file']
img = Image.open(img_file.stream)
# Применим простую обработку: например, повернём изображение
img = img.rotate(90, expand=True)
buf = io.BytesIO()
img.save(buf, format='JPEG')
buf.seek(0)
return send_file(buf, mimetype='image/jpeg')
if __name__ == "__main__":
app.run(debug=True)
## Как это работает?
1. Пользователь отправляет картинку на
/upload
через POST-запрос.2. Сервер открывает изображение с помощью Pillow.
3. Обрабатывает изображение (здесь — поворот на 90 градусов).
4. Возвращает обработанный файл пользователю.
## Немного больше магии
А вот как сделать превью картинки:
img = Image.open(img_file.stream)
img.thumbnail((128, 128))
А если хотите фильтр «чёрно-белое фото» — это одна строчка:
img = img.convert('L')
## Как попробовать?
Можно использовать Postman или curl:
curl -F "file=@your_image.jpg" http://127.0.0.1:5000/upload --output result.jpg
## Краткие советы
- Всегда проверяйте формат изображения!
- Защитите приложение от загрузки слишком больших файлов.
- Pillow поддерживает кучу фильтров и манипуляций: кадрирование, размытие, изменение яркости и многое другое.
Обработка изображений в веб-приложениях на Python — вопрос пары строчек кода. Главное — фантазия и понимание, как устроен ваш стек. Экспериментируйте, и пусть ваше приложение станет стильнее и удобнее!
До встречи,
Иван
Привет! С вами Иван, и сегодня мы заглянем под обложку одного из самых популярных форматов для документов — PDF. Если вы думали, что читать, объединять или вырезать страницы из PDF — это удел только офисных программ, то пришло время познакомиться с модулем PyPDF2 в Python!
Что такое PyPDF2?
PyPDF2 — это пакет, который позволяет легко обрабатывать PDF-файлы: читать, извлекать текст, собирать вместе разные документы и даже защищать их паролем. Звучит как магия? Давайте попробуем на практике.
### Чтение PDF: быстро и просто
Допустим, у вас есть файл
Вот и всё! Открыли, прочитали первую страницу, вывели текст. Никаких танцев с бубном.
### Склейка документов: дела объединённые
Хотите объединить несколько PDF-файлов в один? Смотрите, как это делается:
Вуаля! Теперь
### Извлечение страниц: никаких лишних листов
Бывает, надо сохранить только несколько нужных страниц. За это отвечает PdfWriter:
Теперь у вас новый PDF только с выбранными страницами!
### Безопасность: ставим пароль
Если хочется оставить секретные заметки только для себя:
Теперь открыть
---
PyPDF2 делает работу с PDF простой и гибкой, как и должно быть в Python. Приложения — на любой вкус: отчеты, автоматизация документов, просто эксперименты. Надеюсь, этот краткий обзор вдохновит вас на новые проекты!
Что такое PyPDF2?
PyPDF2 — это пакет, который позволяет легко обрабатывать PDF-файлы: читать, извлекать текст, собирать вместе разные документы и даже защищать их паролем. Звучит как магия? Давайте попробуем на практике.
### Чтение PDF: быстро и просто
Допустим, у вас есть файл
sample.pdf
, и вы хотите вывести его содержимое на экран. Всё элементарно:import PyPDF2
with open('sample.pdf', 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
page = pdf_reader.pages[0]
print(page.extract_text())
Вот и всё! Открыли, прочитали первую страницу, вывели текст. Никаких танцев с бубном.
### Склейка документов: дела объединённые
Хотите объединить несколько PDF-файлов в один? Смотрите, как это делается:
import PyPDF2
merger = PyPDF2.PdfMerger()
for pdf in ['file1.pdf', 'file2.pdf']:
merger.append(pdf)
with open('merged.pdf', 'wb') as output:
merger.write(output)
Вуаля! Теперь
merged.pdf
содержит страницы обоих исходных файлов. Быстро, изящно и удобно.### Извлечение страниц: никаких лишних листов
Бывает, надо сохранить только несколько нужных страниц. За это отвечает PdfWriter:
import PyPDF2
reader = PyPDF2.PdfReader('big.pdf')
writer = PyPDF2.PdfWriter()
for num in [0, 2]: # Например, 1-я и 3-я страницы
writer.add_page(reader.pages[num])
with open('extracted.pdf', 'wb') as out:
writer.write(out)
Теперь у вас новый PDF только с выбранными страницами!
### Безопасность: ставим пароль
Если хочется оставить секретные заметки только для себя:
import PyPDF2
reader = PyPDF2.PdfReader('open.pdf')
writer = PyPDF2.PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.encrypt('StrongPassword!')
with open('protected.pdf', 'wb') as out:
writer.write(out)
Теперь открыть
protected.pdf
без пароля не получится.---
PyPDF2 делает работу с PDF простой и гибкой, как и должно быть в Python. Приложения — на любой вкус: отчеты, автоматизация документов, просто эксперименты. Надеюсь, этот краткий обзор вдохновит вас на новые проекты!