ru
Feedback
Коробка с питоном

Коробка с питоном

Открыть в Telegram

Заметки от Python-разработчика: сниппеты, обзоры пакетов, новости и другая полезная информация. Автор: @kiriharu

Больше
462
Подписчики
-124 часа
Нет данных7 дней
-530 день
Архив постов
Кстати про используемый там tablib! Это очень полезная библиотека, которая позволяет создавать "табличные датасеты" с которым
Кстати про используемый там tablib! Это очень полезная библиотека, которая позволяет создавать "табличные датасеты" с которыми можно производить некоторые операции (поиск данных, например) или экспортировать их в необходимый формат. Для тех, кто не понимает что такое "табличный датасет" (tabular data sets) - проще говоря это набор данных в виде таблички. Сам tablib поддерживает сегрегацию, динамические колонки, тегирование и фильтрование данных. Ну и вишенка на торте - экспорт в почти что угодно. На скриншоте, кстати, пример :) Github | Документация #библиотека

Проект который я пишу в основном на Django, поэтому в следующее время будет довольно много ресурсов по ней 🌚 Есть задача реализовать импорт/экспорт сущностей (в различных форматах), библиотека django-import-export позволяет сделать это в кратчайшие сроки. Можно, конечно, реализовать свой импорт/экспорт, но зачем изобретать велосипед? К слову, библиотека поддерживается, активность на гитхабе есть, поэтому с ней проблем быть не должно. Что она умеет? - Экспорт в различные форматы: Excel, CSV, JSON и вообще любой другой формат, который поддерживает tablib - Интеграция с админкой (импорт, экспорт) - Превью импорта - Экспорт с поддержкой фильтров Github | Документация #библиотека #django

Давным давно я писал обертку для сервиса, которая генерирует текст-рыбу. Она нужна была чтобы заполнять поля с контентом. Сов
Давным давно я писал обертку для сервиса, которая генерирует текст-рыбу. Она нужна была чтобы заполнять поля с контентом. Совсем недавно я начал писать свой проект и углубился в тестирование. Одним из результатов моего поиска ресурсов по этой теме стала библиотека Faker. Faker генерирует фейковые данные. При чем, он умеет генерировать не только текст - он также умеет генерировать адреса, имена, а если чего-то нет - можно поискать провайдера для этого. Github | Документация #тестирование #библиотека

Если вы пишите на Django или собираетесь писать на нём, я нашёл довольно адекватный и хороший стаилгайд от HackSoftware, который позволит вашему коду на Django не превратиться в макароны. Стаилгайд описывает большинство кейсов, с которыми сталкивается разработчик - от взаимодействия с моделями и сервисами, до тестирования и работы с Celery. #ссылочки #django

Ormar - очень интересная и небольшая асинхронная ORM, которая поддерживает Postgres, MySQL и SQLite. Построена на базе Pydantic и SQLAlchemy. Суть проекта - создать легкую ORM, которая могла бы использоваться напрямую (в цикле запрос-ответ) с FastAPI или другими фреимворками. На данный момент по моему мнению выглядит неплохо, идеологически это достойная замена для WIP SQLModel. Github | Документация #библиотека

What the f*ck Python - репозиторий на Github, в котором собраны некоторые интересные примеры с объяснениями, почему происходят те или иные вещи в Python. #ссылочки

Предложение выпилить GIL продолжают активно обсуждать. На ежегодный Python core development sprint пригласили Sam Gross (автор nogil), и задавали ему много разных вопросов. Все под впечатлением. Всерьёз обсуждается вливание этого экспериментального форка в основной код CPython, но спешить с этим точно не будут, потому что изменения такого масштаба в интерпретаторе потребуют адаптации многих библиотек и пользовательского кода. Изменение крупное, но если его добавлять небольшими кусками и растянуть этот процесс на несколько лет, то получится избежать Python 4. А Python 4 никто не хочет. Сэма пригласили присоединиться к числу core-разработчиков интерпретатора. Łukasz Langa будет его менторить. Пока что всё выглядит очень оптимистично. Ждите Python 3.20 без GIL 😅 https://lukasz.langa.pl/5d044f91-49c1-4170-aed1-62b6763e6ad0/ #gil

aiomisc - огромное количество различных утилит для asyncio. Из самых полезных утилит для себя выделил возможность создавать э
aiomisc - огромное количество различных утилит для asyncio. Из самых полезных утилит для себя выделил возможность создавать энтрипоинты с логгированием, огромное количество классов-сервисов (PeriodicService, CronService и т.д.), работа с потоками и управление сигналами. GitHub | Документация #библиотека #asyncio

Ручной проход по списку Задачка: нужно пройти по списку не используя цикл for. Решение у этой задачи достаточно простое - мож
Ручной проход по списку Задачка: нужно пройти по списку не используя цикл for. Решение у этой задачи достаточно простое - можно использовать функцию next() и ловить исключение StopIteration. На скриншоте можно увидеть пример с использованием цикла while. Здесь мы получаем итератор - это такой объект, который облегчает навигацию по коллекциям. Дальше в цикле вызываем next(), который получает следующий элемент и так до тех пор пока элементы не закончатся - индикатором этого будет вызов исключения StopIteration.

Костылерование и велосипедостроение продолжается 🗿! Делаю бота в телеге, решил при помощи Github Actions прогонять тесты в д
Костылерование и велосипедостроение продолжается 🗿! Делаю бота в телеге, решил при помощи Github Actions прогонять тесты в докере и дальше деплоить. Менеджмент зависимостей через poetry. Из-за того что poetry ставит кучу ненужных мне вещей, хочется экспортить мои зависимости в requirements.txt. Первой идеей был git hook, но у нас тут Github Actions есть, давайте генерировать при помощи него 🗿 Результатом стал вот такой workflow. Оно ставит Ubuntu 20.04, Python 3.9 и Poetry 1.1.7. После чего экспортит зависимости и пушит их вам в репозиторий. Зачем я это сделал? Не понятно, интерес иногда делает веселые вещи. #github #poetry

Небольшой хинт про использование Poetry в Docker - зависимости можно экспортировать в обычный requirements.txt, таким образом
Небольшой хинт про использование Poetry в Docker - зависимости можно экспортировать в обычный requirements.txt, таким образом избегая установки и обновления poetry. Если вам необходимо просто установить зависимости - экспортируйте их в requirements.txt. А дальше ставьте их как обычно, через pip. #poetry #docker

Поиск N максимальных или минимальных элементов. Если вы хотите создать список из N максимальных или минимальных элементов, мо
Поиск N максимальных или минимальных элементов. Если вы хотите создать список из N максимальных или минимальных элементов, модуль heapq вам поможет в этом. У этого модуля есть две функции: nlargest() и nsmallest(), которые, соответственно ищут максимальные и минимальные элементы. Например: >>> nums = [10, 20, 30, 40, 55, 632, -3, 98321, 82, 0, 8] >>> heapq.nlargest(4, nums) [98321, 632, 82, 55] >>> heapq.nsmallest(4, nums) [-3, 0, 8, 10] Обе функции принимают параметр key, который позволяет их использовать с сложными структурами данных. Например: currency = [ dict(name="Etherium", price=3323), dict(name="Bitcoin", price=45538), dict(name="ZCash", price=132), dict(name="Litecoin", price=184), dict(name="OmiseGo", price=8.933) ] >>> heapq.nsmallest(2, currency, key=lambda s: s['price']) [{'name': 'OmiseGo', 'price': 8.933}, {'name': 'ZCash', 'price': 132}] >>> heapq.nlargest(2, currency, key=lambda s: s['price']) [{'name': 'Bitcoin', 'price': 45538}, {'name': 'Etherium', 'price': 3323}]

Хочу обратить ваше внимание на канал с актуальными ссылками на новости, подкасты, книги и просто интересные материалы из мира Python. Если хочешь всегда быть в курсе событий и не пропускать ничего интересного - подписывайся на Python Daily. В канале удобная навигация с помощью тегов, а благодаря постоянно обновляющимся источникам вам всегда будет что почитать в дороге или во время обеденного перерыва. https://t.me/pydaily

orjson - самая быстрая библиотека для (де)сериализации json, написанная на Rust. Умеет нативно сериализовать объекты из datac
orjson - самая быстрая библиотека для (де)сериализации json, написанная на Rust. Умеет нативно сериализовать объекты из dataclass, datetime, numpy и UUID. Имеет множество опций для тонкой настройки парсера, содержит вещи которых нет в парсере стандартной библиотеки. Имеет более полное соответствие UTF-8 и JSON формату. PyPi | GitHub | Бенчмарки #библиотека

Уже слышали о парне, который запустил челлендж Учу Python с нуля? В своем канале он делится с подписчиками отчетами о пройден
Уже слышали о парне, который запустил челлендж Учу Python с нуля? В своем канале он делится с подписчиками отчетами о пройденном, решениями задач и другими полезными материалами. Уже "закрыл" основы и начинает работать с объектами, классами и идет дальше! Цель, которую он себе поставил - свой блог на Django до Нового года, а глобально - в 2к22 получить оффер на вакансию джуниора. И, кстати, ему 33 года, начинать никогда не поздно! Сейчас его канал можно использовать как телеграм-учебник по Python, начиная с основ! Есть и теория и практика, учи пайтон прямо в телеграм! В общем, нет причин не подписаться на этого парня, не смотря ни на что он движется к своей цели, за этим интересно понаблюдать! Переходите на его канал @pywayru и поддержите своей подпиской!

Про применение all() Стандартная библиотека Python полна полезных вещей, но полезные вещи есть даже среди встроенных функций.
Про применение all() Стандартная библиотека Python полна полезных вещей, но полезные вещи есть даже среди встроенных функций. Одна из таких встроенных функций - это all(). Функция all() возвращает True, если все элементы истинные (или объект пустой). К примеру, all() очень удобно использовать с генераторами. Например, мы можем проверить, являются ли все октеты в IP-адресе числами: >>> all(i.isdigit() for i in '127.0.0.b'.split('.')) False >>> all(i.isdigit() for i in '127.0.0.1'.split('.')) True

Типизация именованных кортежей. Один из комментаторов указал, что namedtuple() объявлен устаревшим и в 3.10 его поддержка пре
Типизация именованных кортежей. Один из комментаторов указал, что namedtuple() объявлен устаревшим и в 3.10 его поддержка прекратится. Что же делать? Использовать NamedTuple, если в вашем проекте питон выше версии 3.6. Именованный кортеж можно создать 2 путями - через наследование NamedTuple (класс Skills) или старым способом (AnotherSkills). Оба способа содержат аннотации типов, повышающие (как минимум) читаемость кода. Все методы, которые были в namedtuple (_make(), _replace(), _asdict()) работают: >>> s = Skills(0) >>> s._asdict() {'mining': 0, 'excavating': 1} Теперь мы можем посмотреть на аннотации:
s.__annotations__
{'mining': <class 'int'>, 'excavating': <class 'int'>}

Так же, ничего не мешает добавлять новые методы или оверрайтить существующие. В примере у Skills переопределен метод для str(): >>>str(s) 'Какой качок, уровень копания: 0\nуровень лесорубства: 100' GitHub

В комментариях спросили, почему используются методы которые начинаются с нижнего подчеркивания, так как так принято обозначать приватные методы класса (которые не доступны пользователям). Ответ прост - соглашение об именах начинающихся со знака подчёркивания здесь имеет другое значение. Методы с нижним подчеркиванием являются вспомогательными, а проименованы они так чтобы избежать коллизий имён с полями кортежа. А мы вернемся к нашим методам. Метод _asdict() создаст словарь из именованного кортежа и вернет его:
>>> skills._asdict()
{'Mining': 1, 'Excavating': 2, 'Boiling': 3}

Ещё один полезный метод - _fields(). Он вернет кортеж из полей. Очень полезно, если вы хотите создать ещё один именованный кортеж: >>> AllSkills = namedtuple('AllSkills', Skills._fields + ('Taming', 'Woodcutting')) >>> AllSkills._fields ('Mining', 'Excavating', 'Boiling', 'Taming', 'Woodcutting')

В канале недавно уже был пост про namedtuple, но мне ещё есть что про него рассказать. Первое, что я хотел бы вам показать -
В канале недавно уже был пост про namedtuple, но мне ещё есть что про него рассказать. Первое, что я хотел бы вам показать - именованный кортеж можно создать с помощью любой структуры данных, которая поддерживает итерирование:
>>> lst = ['Mining', 'Excavating', 'Boiling']
>>> Skills = namedtuple('Skills', lst)
>>> skills = Skills(1, 2, 3)
>>> skills
Skills(Mining=1, Excavating=2, Boiling=3)

Ещё мы можем создать кортеж через метод _make():
>>> skills = Skills._make([1, 2, 3])
Skills(Mining=1, Excavating=2, Boiling=3)

В примере используется список, но никто не мешает вам сделать такое же с кортежем, множеством и даже словарем (но вот только значения которые вы установите для ключа игнорируются). Именованные кортежи неизменяемые, но мы можем использовать метод _replace(), чтобы изменить данные. Под капотом он использует метод _make для создания нового кортежа, поэтому, по сути, мы просто пересоздадим кортеж:
>>> skills._replace(Mining=100)
Skills(Mining=100, Excavating=2, Boiling=3)