🖥 Textcase — это библиотека на языке Python, созданная для преобразования строк в разные стили написания.
Библиотека поддерживает такие форматы, как snake_case, kebab-case, camelCase, PascalCase, CONSTANT_CASE, а также преобразование в нижний, верхний и титульный регистры.
Основные характеристики Textcase:
- Обработка акронимов: библиотека корректно распознает и форматирует акронимы в строках, например, HTTPRequest.
GitHub
- Поддержка символов вне ASCII: она правильно работает с символами, которые выходят за пределы ASCII. Однако библиотека не делает предположений о языке ввода; например, диграф 'ij' в голландском языке не будет капитализирован как единый символ.
- Высокая производительность: библиотека реализована эффективно, без использования регулярных выражений.
- Отсутствие внешних зависимостей: библиотека не требует внешних зависимостей, что делает ее легкой и простой для интеграции.
Установка:
pip install textcase
Пример использования:
from textcase import case, convert
print(convert("example string", case.SNAKE)) # example_string
print(convert("ExampleString", case.KEBAB)) # example-string
print(convert("example-string", case.CAMEL)) # exampleString
print(convert("Example String", case.PASCAL)) # ExampleString
🖥 Github (https://github.com/zobweyt/textcase)
📌 Документация (https://zobweyt.github.io/textcase/#features)
@Python_Community_ru
Библиотека поддерживает такие форматы, как snake_case, kebab-case, camelCase, PascalCase, CONSTANT_CASE, а также преобразование в нижний, верхний и титульный регистры.
Основные характеристики Textcase:
- Обработка акронимов: библиотека корректно распознает и форматирует акронимы в строках, например, HTTPRequest.
GitHub
- Поддержка символов вне ASCII: она правильно работает с символами, которые выходят за пределы ASCII. Однако библиотека не делает предположений о языке ввода; например, диграф 'ij' в голландском языке не будет капитализирован как единый символ.
- Высокая производительность: библиотека реализована эффективно, без использования регулярных выражений.
- Отсутствие внешних зависимостей: библиотека не требует внешних зависимостей, что делает ее легкой и простой для интеграции.
Установка:
pip install textcase
Пример использования:
from textcase import case, convert
print(convert("example string", case.SNAKE)) # example_string
print(convert("ExampleString", case.KEBAB)) # example-string
print(convert("example-string", case.CAMEL)) # exampleString
print(convert("Example String", case.PASCAL)) # ExampleString
🖥 Github (https://github.com/zobweyt/textcase)
📌 Документация (https://zobweyt.github.io/textcase/#features)
@Python_Community_ru
📚 "Космический Python: Создание Чистых Архитектур для Приветствия Неудач"
Это бесплатная книга, которая поможет читателю освоить процесс разработки сложного приложения на Python с применением современных архитектурных подходов.
Целевая аудитория: Python-разработчики, которые уже знают основы языка, но хотят научиться проектировать и создавать крупные приложения, избегая плохой структуры проектов и "спагетти-кода".
Ключевые темы и концепции, упомянутые в предисловии:
▪ Архитектурные паттерны: Особое внимание уделяется чистым архитектурам (Clean Architecture), таким как Порты и Адаптеры (Гексагональная Архитектура). Основная идея заключается в изоляции ядра бизнес-логики от внешних зависимостей, таких как базы данных, веб-фреймворки и внешние API.
▪ Предметно-ориентированное проектирование (Domain-Driven Design - DDD): Как моделировать сложную бизнес-логику, сосредоточившись на предметной области.
▪ Событийно-ориентированная архитектура (Event-Driven Architecture - EDA): Использование событий для взаимодействия компонентов системы, что способствует слабой связанности.
▪ Разделение ответственности запросов и команд (Command Query Responsibility Segregation - CQRS): Паттерн для разделения операций чтения и записи данных, что может повысить производительность и масштабируемость.
▪ Тестирование: Подчеркивается важность тестирования на разных уровнях (модульное, интеграционное, сквозное) как неотъемлемой части процесса разработки и поддержки архитектуры.
▪ Управление зависимостями (Dependency Injection): Техники для создания слабосвязанных компонентов.
🔗 Книга (https://www.cosmicpython.com/book/introduction.html)
@Python_Community_ru
Это бесплатная книга, которая поможет читателю освоить процесс разработки сложного приложения на Python с применением современных архитектурных подходов.
Целевая аудитория: Python-разработчики, которые уже знают основы языка, но хотят научиться проектировать и создавать крупные приложения, избегая плохой структуры проектов и "спагетти-кода".
Ключевые темы и концепции, упомянутые в предисловии:
▪ Архитектурные паттерны: Особое внимание уделяется чистым архитектурам (Clean Architecture), таким как Порты и Адаптеры (Гексагональная Архитектура). Основная идея заключается в изоляции ядра бизнес-логики от внешних зависимостей, таких как базы данных, веб-фреймворки и внешние API.
▪ Предметно-ориентированное проектирование (Domain-Driven Design - DDD): Как моделировать сложную бизнес-логику, сосредоточившись на предметной области.
▪ Событийно-ориентированная архитектура (Event-Driven Architecture - EDA): Использование событий для взаимодействия компонентов системы, что способствует слабой связанности.
▪ Разделение ответственности запросов и команд (Command Query Responsibility Segregation - CQRS): Паттерн для разделения операций чтения и записи данных, что может повысить производительность и масштабируемость.
▪ Тестирование: Подчеркивается важность тестирования на разных уровнях (модульное, интеграционное, сквозное) как неотъемлемой части процесса разработки и поддержки архитектуры.
▪ Управление зависимостями (Dependency Injection): Техники для создания слабосвязанных компонентов.
🔗 Книга (https://www.cosmicpython.com/book/introduction.html)
@Python_Community_ru
🖥 Вот 17 лучших репозиториев на GitHub для изучения Python с ссылками:
1. 30-Days-Of-Python (https://github.com/Asabeneh/30-Days-Of-Python) — 30-дневный челлендж по основам Python.
2. Python Basics (https://github.com/mikeckennedy/python-basics-exercises) — основы Python для новичков, просто и с примерами.
3. Learn Python (https://github.com/trekhleb/learn-python) — справочник с кодом, пояснениями и практическими примерами.
4. Python Guide (https://github.com/realpython/python-guide) — гайд по практикам, инструментам и сложным темам.
5. Learn Python 3 (https://github.com/jerry-git/learn-python3) — руководство по Python 3 с практическими заданиями для начинающих.
6. Python Programming Exercises (https://github.com/zhiwehu/Python-programming-exercises) — более 100 задач по Python.
7. Coding Problems (https://github.com/MTrajK/coding-problems) — алгоритмы и структуры данных для собеседований.
8. Project-Based-Learning (https://github.com/practical-tutorials/project-based-learning) — изучение Python через реальные проекты.
9. Projects (https://github.com/karan/Projects) — идеи проектов для улучшения навыков.
10. 100-Days-Of-ML-Code (https://github.com/Avik-Jain/100-Days-Of-ML-Code) — машинное обучение на Python шаг за шагом.
11. TheAlgorithms/Python (https://github.com/TheAlgorithms/Python) — алгоритмы и структуры данных на Python.
12. Amazing-Python-Scripts (https://github.com/aviaryan/amazing-python-scripts) — полезные скрипты: от утилит до автоматизации.
13. Geekcomputers/Python (https://github.com/geekcomputers/Python) — скрипты для работы с сетью, файлами и задачами.
14. Materials (https://github.com/realpython/materials) — код и проекты от Real Python.
15. Awesome Python (https://github.com/vinta/awesome-python) — лучшие фреймворки, библиотеки и ресурсы.
16. 30-Seconds-of-Python (https://github.com/30-seconds/30-seconds-of-python) — короткие сниппеты для быстрого решения задач.
17. Python Reference (https://github.com/rasbt/python_reference) — скрипты, туториалы и полезные советы.
#python #github #learning
@Python_Community_ru
1. 30-Days-Of-Python (https://github.com/Asabeneh/30-Days-Of-Python) — 30-дневный челлендж по основам Python.
2. Python Basics (https://github.com/mikeckennedy/python-basics-exercises) — основы Python для новичков, просто и с примерами.
3. Learn Python (https://github.com/trekhleb/learn-python) — справочник с кодом, пояснениями и практическими примерами.
4. Python Guide (https://github.com/realpython/python-guide) — гайд по практикам, инструментам и сложным темам.
5. Learn Python 3 (https://github.com/jerry-git/learn-python3) — руководство по Python 3 с практическими заданиями для начинающих.
6. Python Programming Exercises (https://github.com/zhiwehu/Python-programming-exercises) — более 100 задач по Python.
7. Coding Problems (https://github.com/MTrajK/coding-problems) — алгоритмы и структуры данных для собеседований.
8. Project-Based-Learning (https://github.com/practical-tutorials/project-based-learning) — изучение Python через реальные проекты.
9. Projects (https://github.com/karan/Projects) — идеи проектов для улучшения навыков.
10. 100-Days-Of-ML-Code (https://github.com/Avik-Jain/100-Days-Of-ML-Code) — машинное обучение на Python шаг за шагом.
11. TheAlgorithms/Python (https://github.com/TheAlgorithms/Python) — алгоритмы и структуры данных на Python.
12. Amazing-Python-Scripts (https://github.com/aviaryan/amazing-python-scripts) — полезные скрипты: от утилит до автоматизации.
13. Geekcomputers/Python (https://github.com/geekcomputers/Python) — скрипты для работы с сетью, файлами и задачами.
14. Materials (https://github.com/realpython/materials) — код и проекты от Real Python.
15. Awesome Python (https://github.com/vinta/awesome-python) — лучшие фреймворки, библиотеки и ресурсы.
16. 30-Seconds-of-Python (https://github.com/30-seconds/30-seconds-of-python) — короткие сниппеты для быстрого решения задач.
17. Python Reference (https://github.com/rasbt/python_reference) — скрипты, туториалы и полезные советы.
#python #github #learning
@Python_Community_ru
🗂️ Ballista — это распределённый движок для выполнения запросов, основанный на Apache DataFusion. Этот инструмент позволяет одновременно обрабатывать запросы на нескольких узлах, при этом сохраняя совместимость с существующими SQL-запросами, включая сложные операции объединения, подзапросы и общие табличные выражения.
Процесс развертывания упрощён благодаря использованию Docker-образов и поддержке Kubernetes, а встроенные бенчмарки показывают, что Ballista уже может соперничать со Spark по скорости обработки запросов, подобных TPC-H.
🤖 GitHub (https://github.com/apache/datafusion-ballista)
@Python_Community_ru
Процесс развертывания упрощён благодаря использованию Docker-образов и поддержке Kubernetes, а встроенные бенчмарки показывают, что Ballista уже может соперничать со Spark по скорости обработки запросов, подобных TPC-H.
🤖 GitHub (https://github.com/apache/datafusion-ballista)
@Python_Community_ru
🖥 Watchdog — это библиотека, которая предназначена для мониторинга изменений в файловой системе и имеет стильный дизайн.
Этот инструмент позволяет фиксировать различные операции с файлами и папками, такие как создание, удаление, модификация и перемещение, и работает в средах Linux, macOS и Windows.
Библиотека будет особенно полезна в следующих случаях:
▪ автоматический перезапуск серверов при обновлениях файлов
▪ обработка новых загружаемых файлов в указанную папку
▪ синхронизация содержимого папок
▪ создание механизмов резервного копирования, которые быстро реагируют на изменения
🔗 Watchdog (https://github.com/gorakhargosh/watchdog)
🔗 Документация (https://python-watchdog.readthedocs.io/en/stable/quickstart.html)
@Python_Community_ru
Этот инструмент позволяет фиксировать различные операции с файлами и папками, такие как создание, удаление, модификация и перемещение, и работает в средах Linux, macOS и Windows.
Библиотека будет особенно полезна в следующих случаях:
▪ автоматический перезапуск серверов при обновлениях файлов
▪ обработка новых загружаемых файлов в указанную папку
▪ синхронизация содержимого папок
▪ создание механизмов резервного копирования, которые быстро реагируют на изменения
🔗 Watchdog (https://github.com/gorakhargosh/watchdog)
🔗 Документация (https://python-watchdog.readthedocs.io/en/stable/quickstart.html)
@Python_Community_ru
🖥 DeepGit: Repo Discovery — это бесплатный инструмент на основе искусственного интеллекта, который помогает находить полезные репозитории на GitHub с помощью семантического поиска.
Он построен на системе LangGraph и использует анализ кода, документации и отзывы сообщества, чтобы выделять малоизвестные, но многообещающие проекты.
Ключевые возможности:
▪ Семантическая проверка: ищет не просто по ключевым словам, а «понимает» содержание.
▪ Многогранный анализ: учитывает не только код, но и документацию, активность и отзывы сообщества.
▪ Интеграция с GitHub: сосредоточен на этом экосистемном источнике, упрощая выбор качественных проектов.
🖥 GitHub (https://github.com/zamalali/DeepGit)
@Python_Community_ru
Он построен на системе LangGraph и использует анализ кода, документации и отзывы сообщества, чтобы выделять малоизвестные, но многообещающие проекты.
Ключевые возможности:
▪ Семантическая проверка: ищет не просто по ключевым словам, а «понимает» содержание.
▪ Многогранный анализ: учитывает не только код, но и документацию, активность и отзывы сообщества.
▪ Интеграция с GitHub: сосредоточен на этом экосистемном источнике, упрощая выбор качественных проектов.
🖥 GitHub (https://github.com/zamalali/DeepGit)
@Python_Community_ru
Ibis — это библиотека, которая сочетает в себе SQL и Python.
Устали постоянно переключаться между SQL и pandas?
С помощью Ibis вы можете использовать SQL-запросы и Python-пайплайны в одном коде.
Установка (с поддержкой DuckDB и примерами):
```
pip install 'ibis-framework[duckdb,examples]'
```
Пример:
```python
import ibis
penguins = ibis.examples.penguins.fetch()
# SQL внутри Python
res = penguins.sql("""
SELECT species, island, count(*) AS count
FROM penguins GROUP BY 1, 2
""")
# Фильтрация и сортировка в стиле Python
res.order_by("count")
```
Результат:
```
┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
┃ species ┃ island ┃ count ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━┩
│ string │ string │ int64 │
├───────────┼───────────┼───────┤
│ Adelie │ Biscoe │ 44 │
│ Adelie │ Torgersen │ 52 │
│ Adelie │ Dream │ 56 │
│ Chinstrap │ Dream │ 68 │
│ Gentoo │ Biscoe │ 124 │
└───────────┴───────────┴───────┘
```
Что может Ibis:
— SQL-прослойка для работы с датафреймами
— Один и тот же код работает с DuckDB, PostgreSQL, BigQuery, SQLite и другими
— Унифицированный синтаксис, не зависящий от движка
— Отлично подходит для пайплайнов в области data science
Где может пригодиться:
— Аналитика
— Дашборды
— EDA и быстрые прототипы
— Интеграция SQL в ноутбуках без особых усилий
Совместим с Jupyter, Airflow и всей экосистемой Python.
Подробнее [здесь](http://bis-project.org/)
На Github [здесь](https://github.com/ibis-project/ibis)
@Python_Community_ru
Устали постоянно переключаться между SQL и pandas?
С помощью Ibis вы можете использовать SQL-запросы и Python-пайплайны в одном коде.
Установка (с поддержкой DuckDB и примерами):
```
pip install 'ibis-framework[duckdb,examples]'
```
Пример:
```python
import ibis
penguins = ibis.examples.penguins.fetch()
# SQL внутри Python
res = penguins.sql("""
SELECT species, island, count(*) AS count
FROM penguins GROUP BY 1, 2
""")
# Фильтрация и сортировка в стиле Python
res.order_by("count")
```
Результат:
```
┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
┃ species ┃ island ┃ count ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━┩
│ string │ string │ int64 │
├───────────┼───────────┼───────┤
│ Adelie │ Biscoe │ 44 │
│ Adelie │ Torgersen │ 52 │
│ Adelie │ Dream │ 56 │
│ Chinstrap │ Dream │ 68 │
│ Gentoo │ Biscoe │ 124 │
└───────────┴───────────┴───────┘
```
Что может Ibis:
— SQL-прослойка для работы с датафреймами
— Один и тот же код работает с DuckDB, PostgreSQL, BigQuery, SQLite и другими
— Унифицированный синтаксис, не зависящий от движка
— Отлично подходит для пайплайнов в области data science
Где может пригодиться:
— Аналитика
— Дашборды
— EDA и быстрые прототипы
— Интеграция SQL в ноутбуках без особых усилий
Совместим с Jupyter, Airflow и всей экосистемой Python.
Подробнее [здесь](http://bis-project.org/)
На Github [здесь](https://github.com/ibis-project/ibis)
@Python_Community_ru
🗣 OuteTTS 1.0 — это современный инструмент с открытым исходным кодом для синтеза речи (Text-to-Speech), который фокусируется на высоком качестве озвучивания, клонировании голосов и поддержке множества языков. Основные функции:
🔊 Ключевые возможности:
Высокая производительность:
Способен создавать аудио длительностью до 42 секунд (~8192 токена) за один раз.
Тем не менее, для достижения наилучших результатов рекомендуется ограничивать объем до ~7000 токенов.
- Поддержка клонирования голоса:
Использует образец голоса длиной, например, 10 секунд. В этом случае контекст для синтеза уменьшается: доступно около 32 секунд активного контента (из 42).
- 20 языков:
Поддерживает озвучивание на 20 различных языках, что делает его универсальным решением для мультиязычных проектов.
🛠️ Под капотом:
Хотя в описании не так много деталей о модели, из репозитория на GitHub можно понять, что:
Используются современные архитектуры трансформеров для TTS.
Поддерживается реалистичное клонирование голоса по короткому фрагменту.
Скорость генерации и качество аудио соответствуют лучшим TTS-системам с открытым кодом.
Установка:
git clone https://github.com/edwko/OuteTTS.git
cd OuteTTS
pip install -r requirements.txt
python
from outetts import OuteTTS
tts = OuteTTS(
reference_speaker_path="reference_audio/igor_voice.wav",
language="ru" # поддерживаются и другие языки, например: "en", "ja"
)
text = "Привет, Python разработчик! Я твой кастомный голосовой ассистент."
audio = tts.generate(text)
with open("output.wav", "wb") as f:
f.write(audio)
📥 Ссылка на репозиторий (https://github.com/edwko/OuteTTS)
@Python_Community_ru
🔊 Ключевые возможности:
Высокая производительность:
Способен создавать аудио длительностью до 42 секунд (~8192 токена) за один раз.
Тем не менее, для достижения наилучших результатов рекомендуется ограничивать объем до ~7000 токенов.
- Поддержка клонирования голоса:
Использует образец голоса длиной, например, 10 секунд. В этом случае контекст для синтеза уменьшается: доступно около 32 секунд активного контента (из 42).
- 20 языков:
Поддерживает озвучивание на 20 различных языках, что делает его универсальным решением для мультиязычных проектов.
🛠️ Под капотом:
Хотя в описании не так много деталей о модели, из репозитория на GitHub можно понять, что:
Используются современные архитектуры трансформеров для TTS.
Поддерживается реалистичное клонирование голоса по короткому фрагменту.
Скорость генерации и качество аудио соответствуют лучшим TTS-системам с открытым кодом.
Установка:
git clone https://github.com/edwko/OuteTTS.git
cd OuteTTS
pip install -r requirements.txt
python
from outetts import OuteTTS
tts = OuteTTS(
reference_speaker_path="reference_audio/igor_voice.wav",
language="ru" # поддерживаются и другие языки, например: "en", "ja"
)
text = "Привет, Python разработчик! Я твой кастомный голосовой ассистент."
audio = tts.generate(text)
with open("output.wav", "wb") as f:
f.write(audio)
📥 Ссылка на репозиторий (https://github.com/edwko/OuteTTS)
@Python_Community_ru
GitHub
GitHub - edwko/OuteTTS: Interface for OuteTTS models.
Interface for OuteTTS models. Contribute to edwko/OuteTTS development by creating an account on GitHub.
🔌 python-kasa — это библиотека для управления умными устройствами TP-Link с помощью Python.
Если у вас есть умные розетки, лампы или другие устройства TP-Link и вы хотите их автоматизировать через Python, стоит обратить внимание на эту библиотеку. С её помощью можно легко включать и выключать устройства, проверять их статус и даже управлять ими через командную строку. Поддерживаются как модели Kasa, так и Tapo, включая розетки, выключатели, лампы и даже камеры.
🤖 GitHub (https://github.com/python-kasa/python-kasa)
@Python_Community_ru
Если у вас есть умные розетки, лампы или другие устройства TP-Link и вы хотите их автоматизировать через Python, стоит обратить внимание на эту библиотеку. С её помощью можно легко включать и выключать устройства, проверять их статус и даже управлять ими через командную строку. Поддерживаются как модели Kasa, так и Tapo, включая розетки, выключатели, лампы и даже камеры.
🤖 GitHub (https://github.com/python-kasa/python-kasa)
@Python_Community_ru
🚀 Как Duolingo удалось увеличить производительность микросервисов на 40% с помощью асинхронного Python 🐍⚡
Duolingo поделилась тем, как им удалось существенно улучшить эффективность своих Python-сервисов, перейдя на использование async/await, и сделали это не ради моды, а для снижения затрат.
💸 Мотивация: повышение производительности и уменьшение расходов
Duolingo управляет множеством микросервисов, которые обрабатывают большие объемы трафика. Несмотря на высокую нагрузку, многие их Python-сервисы простаивали в ожидании ввода-вывода — например, при сетевых запросах или взаимодействии с базой данных. Это приводило к неэффективному использованию процессора, и, соответственно, деньги на облачный хостинг расходовались впустую.
Асинхронный код — это способ “переключаться” между задачами во время ожидания, что позволяет более эффективно использовать процессор. Именно это и стало главной мотивацией: не просто стать асинхронными, а сократить расходы.
⚙️ Как проходила миграция
Процесс был постепенным и тщательно продуманным. Вот ключевые шаги:
▪ Переход не “всё или ничего”
Команда не начала с переписывания всего сервиса с нуля. Они начали с изменения отдельных маршрутов на async def, добавляя асинхронность по частям.
▪ Постепенная адаптация инструментов
Пришлось обновить библиотеки и инструменты внутри компании:
▪ HTTP-клиент переписали с использованием aiohttp,
▪ систему аутентификации адаптировали к async-контекстам,
▪ обновили логирование, трассировку и метрики для работы с async-архитектурой.
▪ Тестирование и инфраструктура
Асинхронные изменения потребовали пересмотра тестов. Они внедрили поддержку pytest-asyncio и переосмыслили подход к мокам и фикстурам.
▪ Постепенный запуск в продакшене
Сначала маршруты работали в синхронном режиме. Затем их перевели в асинхронный режим и замерили разницу. Это помогло выявить “узкие места” до массового внедрения.
📈 Результаты: +40% производительности на экземпляр
▪ Эффективнее стал использоваться процессор у каждого экземпляра микросервиса.
▪ Уменьшилось среднее время ответа (latency).
▪ Снизилось количество необходимых экземпляров — экономия в деньгах.
▪ Код стал легче масштабировать и поддерживать в среде с высокой интенсивностью ввода-вывода.
Пока один запрос “ждет”, процессор может выполнять другие задачи.
🔍 Выводы
Duolingo подчеркивает:
асинхронность не нужна “просто потому что это модно”.
Но если у вас сервис с большим числом операций ввода-вывода и важна производительность — асинхронный Python может обеспечить реальный прирост и экономию.
➡ Оригинальный пост (https://blog.duolingo.com/async-python-migration/)
@Python_Community_ru
Duolingo поделилась тем, как им удалось существенно улучшить эффективность своих Python-сервисов, перейдя на использование async/await, и сделали это не ради моды, а для снижения затрат.
💸 Мотивация: повышение производительности и уменьшение расходов
Duolingo управляет множеством микросервисов, которые обрабатывают большие объемы трафика. Несмотря на высокую нагрузку, многие их Python-сервисы простаивали в ожидании ввода-вывода — например, при сетевых запросах или взаимодействии с базой данных. Это приводило к неэффективному использованию процессора, и, соответственно, деньги на облачный хостинг расходовались впустую.
Асинхронный код — это способ “переключаться” между задачами во время ожидания, что позволяет более эффективно использовать процессор. Именно это и стало главной мотивацией: не просто стать асинхронными, а сократить расходы.
⚙️ Как проходила миграция
Процесс был постепенным и тщательно продуманным. Вот ключевые шаги:
▪ Переход не “всё или ничего”
Команда не начала с переписывания всего сервиса с нуля. Они начали с изменения отдельных маршрутов на async def, добавляя асинхронность по частям.
▪ Постепенная адаптация инструментов
Пришлось обновить библиотеки и инструменты внутри компании:
▪ HTTP-клиент переписали с использованием aiohttp,
▪ систему аутентификации адаптировали к async-контекстам,
▪ обновили логирование, трассировку и метрики для работы с async-архитектурой.
▪ Тестирование и инфраструктура
Асинхронные изменения потребовали пересмотра тестов. Они внедрили поддержку pytest-asyncio и переосмыслили подход к мокам и фикстурам.
▪ Постепенный запуск в продакшене
Сначала маршруты работали в синхронном режиме. Затем их перевели в асинхронный режим и замерили разницу. Это помогло выявить “узкие места” до массового внедрения.
📈 Результаты: +40% производительности на экземпляр
▪ Эффективнее стал использоваться процессор у каждого экземпляра микросервиса.
▪ Уменьшилось среднее время ответа (latency).
▪ Снизилось количество необходимых экземпляров — экономия в деньгах.
▪ Код стал легче масштабировать и поддерживать в среде с высокой интенсивностью ввода-вывода.
Пока один запрос “ждет”, процессор может выполнять другие задачи.
🔍 Выводы
Duolingo подчеркивает:
асинхронность не нужна “просто потому что это модно”.
Но если у вас сервис с большим числом операций ввода-вывода и важна производительность — асинхронный Python может обеспечить реальный прирост и экономию.
➡ Оригинальный пост (https://blog.duolingo.com/async-python-migration/)
@Python_Community_ru
Duolingo Blog
How we started our async python migration
Have you ever wanted to try an Async Python migration, but were unsure where to start? Read this post to find out!
🧠 Задача на внимание и знание подводных камней в Python
Что выведет данный код?
def make_funcs():
funcs = []
for i in range(3):
def wrapper(x=i):
return lambda: x
funcs.append(wrapper())
return funcs
a, b, c = make_funcs()
print(a(), b(), c())
❓ Варианты ответа:
A) 0 1 2
B) 2 2 2
C) 0 0 0
D) Ошибка на этапе выполнения
✅ Ответ: 0 1 2
📘 Объяснение:
🔹 Цикл for i in range(3) проходит по значениям 0, 1, 2.
🔹 В каждой итерации вызывается wrapper(x=i) — это копирует текущее значение i в локальную переменную x.
🔹 Затем возвращается lambda: x, которая запоминает это конкретное значение x.
🔹 В итоге:
a() → 0
b() → 1
c() → 2
Если бы мы не использовали x=i по умолчанию, а написали просто lambda: i, все функции замкнули бы одну и ту же переменную i, и на момент вызова она бы уже была равна 3.
@Python_Community_ru
Что выведет данный код?
def make_funcs():
funcs = []
for i in range(3):
def wrapper(x=i):
return lambda: x
funcs.append(wrapper())
return funcs
a, b, c = make_funcs()
print(a(), b(), c())
❓ Варианты ответа:
A) 0 1 2
B) 2 2 2
C) 0 0 0
D) Ошибка на этапе выполнения
✅ Ответ: 0 1 2
📘 Объяснение:
🔹 Цикл for i in range(3) проходит по значениям 0, 1, 2.
🔹 В каждой итерации вызывается wrapper(x=i) — это копирует текущее значение i в локальную переменную x.
🔹 Затем возвращается lambda: x, которая запоминает это конкретное значение x.
🔹 В итоге:
a() → 0
b() → 1
c() → 2
Если бы мы не использовали x=i по умолчанию, а написали просто lambda: i, все функции замкнули бы одну и ту же переменную i, и на момент вызова она бы уже была равна 3.
@Python_Community_ru
🐍 Задача по Python: Замыкания и области видимости
Что покажет следующий код?
def outer():
x = 5
def inner():
nonlocal x
x += 1
return x
return inner
f = outer()
print(f())
print(f())
print(f())
Варианты ответа:
A)
7
8
B)
5
5
C)
6
6
D) Ошибка выполнения
---
✅ Правильный ответ: A
Почему:
Функция outer создаёт замыкание. Переменная x сохраняется между вызовами f, так как inner замыкает x и изменяет её с помощью nonlocal. Это классический пример использования замыканий в Python.
@Python_Community_ru
Что покажет следующий код?
def outer():
x = 5
def inner():
nonlocal x
x += 1
return x
return inner
f = outer()
print(f())
print(f())
print(f())
Варианты ответа:
A)
7
8
B)
5
5
C)
6
6
D) Ошибка выполнения
---
✅ Правильный ответ: A
Почему:
Функция outer создаёт замыкание. Переменная x сохраняется между вызовами f, так как inner замыкает x и изменяет её с помощью nonlocal. Это классический пример использования замыканий в Python.
@Python_Community_ru
Строковый метод translate позволяет заменять или удалять несколько символов в строке за один раз. Это похоже на множественные вызовы метода replace.
```python
import string
s = "Hello, world!"
print(s.translate(str.maketrans("", "", string.punctuation)))
# Hello world
```
Метод translate ожидает «таблицу перевода», которую мы создаем с помощью вспомогательного метода класса maketrans.
Третий аргумент (string.punctuation в примере) — это строка символов, которые мы хотим удалить.
Значение string.punctuation включает в себя следующие символы:
!#$%&'()*+,-./:;?@[\]^_{|}~`
Суть шпаргалки заключается в том, что она демонстрирует, как эффективно удалить все стандартные знаки препинания из строки в Python, используя комбинацию методов str.maketrans для создания инструкции по удалению и str.translate для применения этой инструкции к строке.
@Python_Community_ru
```python
import string
s = "Hello, world!"
print(s.translate(str.maketrans("", "", string.punctuation)))
# Hello world
```
Метод translate ожидает «таблицу перевода», которую мы создаем с помощью вспомогательного метода класса maketrans.
Третий аргумент (string.punctuation в примере) — это строка символов, которые мы хотим удалить.
Значение string.punctuation включает в себя следующие символы:
!#$%&'()*+,-./:;?@[\]^_{|}~`
Суть шпаргалки заключается в том, что она демонстрирует, как эффективно удалить все стандартные знаки препинания из строки в Python, используя комбинацию методов str.maketrans для создания инструкции по удалению и str.translate для применения этой инструкции к строке.
@Python_Community_ru