Реальная история
Не так давно у меня произошла похожая ситуация. Я предпочитаю хранить текст, который бот отправляет пользователям, в отдельных YAML-файлах. При запуске бота сначала читаются эти файлы, а затем бот начинает свою работу. Чтобы ускорить процесс запуска, я решил распараллелить задачи: пока бот стартует, файлы с текстами загружаются в оперативную память.
Однако я не учёл, что первое сообщение, которое бот отправляет при запуске, — это уведомление администратору о том, что бот запущен. Это сообщение, как и другие, находилось в YAML-файлах. В результате бот стартовал, пытался отправить уведомление, но не мог, потому что файлы ещё не были прочитаны.
Вывод: хранить текстовые файлы удобно для пользовательских сообщений, но критически важные сервисные сообщения лучше хранить непосредственно в коде. Это позволяет избежать ситуации, когда программа пытается использовать данные, которые ещё не успели загрузиться.
Не так давно у меня произошла похожая ситуация. Я предпочитаю хранить текст, который бот отправляет пользователям, в отдельных YAML-файлах. При запуске бота сначала читаются эти файлы, а затем бот начинает свою работу. Чтобы ускорить процесс запуска, я решил распараллелить задачи: пока бот стартует, файлы с текстами загружаются в оперативную память.
Однако я не учёл, что первое сообщение, которое бот отправляет при запуске, — это уведомление администратору о том, что бот запущен. Это сообщение, как и другие, находилось в YAML-файлах. В результате бот стартовал, пытался отправить уведомление, но не мог, потому что файлы ещё не были прочитаны.
Вывод: хранить текстовые файлы удобно для пользовательских сообщений, но критически важные сервисные сообщения лучше хранить непосредственно в коде. Это позволяет избежать ситуации, когда программа пытается использовать данные, которые ещё не успели загрузиться.
🔥4🤯1
Напиши свой ответ в комментариях. Если ты знаешь правильный ответ, то мы будем рады видеть тебя на нашем контесте.
🔥5
Привет, друзья!
Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:
Понедельник (07.10.2024) Дайджест за предыдущую неделю
Вторник (08.10.2024) Знаете ли вы, как Namespace и cgroups обеспечивают изоляцию в контейнеризации?
Среда (09.10.2024)
Четверг (10.10.2024) Obsidian LiveSync - совместная работа над проектной документацией
Пятница (11.10.2024) Пятничный кинорелакс
Суббота (12.10.2024) Задача
Воскресенье (13.10.2024) Текстовый разбор задачи
Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе!
С уважением,
Команда канала "Код на салфетке".
#дайджест #материалы #новости #код_на_салфетке
Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:
Понедельник (07.10.2024) Дайджест за предыдущую неделю
Вторник (08.10.2024) Знаете ли вы, как Namespace и cgroups обеспечивают изоляцию в контейнеризации?
Среда (09.10.2024)
Четверг (10.10.2024) Obsidian LiveSync - совместная работа над проектной документацией
Пятница (11.10.2024) Пятничный кинорелакс
Суббота (12.10.2024) Задача
Воскресенье (13.10.2024) Текстовый разбор задачи
Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе!
С уважением,
Команда канала "Код на салфетке".
#дайджест #материалы #новости #код_на_салфетке
🔥5👍1
Напиши свой ответ в комментариях. Если ты знаешь правильный ответ, то мы будем рады видеть тебя на нашем контесте.
🔥4
Знаете ли вы, как использовать Namespace и cgroups для обеспечения изоляции при контейнеризации?
Namespace изолирует системные аспекты, создавая отдельные пространства для каждого контейнера. Например:
- PID namespace: изолирует процессы
- Network namespace: изолирует сетевые интерфейсы
- Mount namespace: изолирует точки монтирования файловых систем
Cgroups управляет распределением системных ресурсов между контейнерами и устанавливает лимиты использования:
В этом примере запуск Docker контейнера происходит с ограничениями cgroups:
Так, namespace обеспечивает изоляцию на уровне системных ресурсов, а cgroups предоставляет контроль над количеством ресурсов, доступных контейнеру.
Код на салфетке x Кусочки кода
Namespace изолирует системные аспекты, создавая отдельные пространства для каждого контейнера. Например:
- PID namespace: изолирует процессы
- Network namespace: изолирует сетевые интерфейсы
- Mount namespace: изолирует точки монтирования файловых систем
Cgroups управляет распределением системных ресурсов между контейнерами и устанавливает лимиты использования:
docker run -d --name appname \
--cpus 0.5 \
--memory 256m \
--memory-swap 512m \
--cpu-shares 512 \
imagename
В этом примере запуск Docker контейнера происходит с ограничениями cgroups:
--cpus 0.5 ограничивает использование CPU до 50% одного ядра--memory 256m ограничивает память до 256 МБ--memory-swap 512m устанавливает лимит подкачки в 512 МБ--cpu-shares 512 задает относительный вес CPUТак, namespace обеспечивает изоляцию на уровне системных ресурсов, а cgroups предоставляет контроль над количеством ресурсов, доступных контейнеру.
Код на салфетке x Кусочки кода
🔥7
Напиши свой ответ в комментариях. Если ты знаешь правильный ответ, то мы будем рады видеть тебя на нашем контесте.
🔥5🤡1
Напиши свой ответ в комментариях. Если ты знаешь правильный ответ, то мы будем рады видеть тебя на нашем контесте.
🔥6
FastAPI 4. Модель пользователя и Alembic
Автор: Иван Ашихмин
В этом посте начнём работу по системе пользователей в проекте. Опишем модели базы данных и инициализируем Alembic для создания миграций.
Читать пост в Telegram
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Гайды #миграции #FastAPI #SQLAlchemy #подключение_БД #black #Классы_моделей #Alembic
Автор: Иван Ашихмин
В этом посте начнём работу по системе пользователей в проекте. Опишем модели базы данных и инициализируем Alembic для создания миграций.
Читать пост в Telegram
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Гайды #миграции #FastAPI #SQLAlchemy #подключение_БД #black #Классы_моделей #Alembic
🔥8👍1👏1🤝1
Приветствую, друзья!
На этой неделе мы приглашаем вас окунуться в мистическое. Этот культовый фильм рассказывает историю Джона Константина, экзорциста и детектива, который борется с демонами и темными силами, угрожающими человечеству. В главной роли блистает Киану Ривз, чья харизма и талант делают этот фильм по-настоящему незабываемым.
Фильм: Константин: Повелитель тьмы
Год: 2005
Джон Константин, обладая способностью распознавать ангелов и демонов в облике людей, пытается покончить с собой, чтобы избавиться от мучительных видений. Однако его попытка неудачна, и он возвращается к жизни против своей воли. Теперь, отмеченный печатью суицида, Константин патрулирует границу между раем и адом, надеясь обрести спасение, сражаясь с земными ставленниками зла.
Устраивайтесь поудобнее и готовьтесь к увлекательному путешествию в мир сверхъестественного. Не забывайте делиться своими впечатлениями и мыслями в комментариях.
Приятного просмотра!
На этой неделе мы приглашаем вас окунуться в мистическое. Этот культовый фильм рассказывает историю Джона Константина, экзорциста и детектива, который борется с демонами и темными силами, угрожающими человечеству. В главной роли блистает Киану Ривз, чья харизма и талант делают этот фильм по-настоящему незабываемым.
Фильм: Константин: Повелитель тьмы
Год: 2005
Джон Константин, обладая способностью распознавать ангелов и демонов в облике людей, пытается покончить с собой, чтобы избавиться от мучительных видений. Однако его попытка неудачна, и он возвращается к жизни против своей воли. Теперь, отмеченный печатью суицида, Константин патрулирует границу между раем и адом, надеясь обрести спасение, сражаясь с земными ставленниками зла.
Устраивайтесь поудобнее и готовьтесь к увлекательному путешествию в мир сверхъестественного. Не забывайте делиться своими впечатлениями и мыслями в комментариях.
Приятного просмотра!
🔥9👍1🤩1
Что выведет этот код? №42
Задача:
У вас есть таблица книг в библиотеке, и вы хотите обновить информацию о книге, если её рейтинг ниже заданного значения. В этом примере, если вы хотите обновить книгу, также будет проверяться, что её текущий рейтинг ниже среднего рейтинга всех книг в библиотеке. Если книга не существует, или если её текущий рейтинг не ниже среднего, обновление не произойдёт.
Пример данных в таблице books:
- id: 1, title: "The Great Gatsby", rating: 4, description: "A classic novel about the 1920s."
- id: 2, title: "To Kill a Mockingbird", rating: 3, description: "A novel about racial injustice."
- id: 3, title: "1984", rating: 5, description: "A dystopian social science fiction."
Код ниже показывает, как это можно реализовать с помощью SQLAlchemy 2.
Что выведет этот код?
Задача:
У вас есть таблица книг в библиотеке, и вы хотите обновить информацию о книге, если её рейтинг ниже заданного значения. В этом примере, если вы хотите обновить книгу, также будет проверяться, что её текущий рейтинг ниже среднего рейтинга всех книг в библиотеке. Если книга не существует, или если её текущий рейтинг не ниже среднего, обновление не произойдёт.
Пример данных в таблице books:
- id: 1, title: "The Great Gatsby", rating: 4, description: "A classic novel about the 1920s."
- id: 2, title: "To Kill a Mockingbird", rating: 3, description: "A novel about racial injustice."
- id: 3, title: "1984", rating: 5, description: "A dystopian social science fiction."
Код ниже показывает, как это можно реализовать с помощью SQLAlchemy 2.
Что выведет этот код?
🔥5
Что выведет код с изображения? №42
Anonymous Quiz
26%
Ничего не произойдёт, так как не соответствует условиям.
4%
Будет обновлён только рейтинг книги.
0%
Будет обновлено только описание книги.
61%
Будут обновлены и рейтинг, и описание книги, если все условия выполнены.
9%
Произойдёт ошибка, так как запрос некорректен.
🤯4⚡2🔥2😭2
Вчера мы опубликовали задачу, в которой нужно было обновить информацию о книге в базе данных, если её рейтинг ниже среднего по библиотеке и нового предложенного значения. Многие участники отметили, что задача оказалась не такой простой, как казалось на первый взгляд, из-за условий, которые могли легко быть упущены.
Задача:
У вас есть таблица книг в библиотеке, и вы хотите обновить информацию о книге, если её рейтинг ниже нового предложенного значения. Но перед обновлением проверяется ещё одно условие: текущий рейтинг книги должен быть ниже среднего рейтинга всех книг в библиотеке.
Пример данных в таблице:
- id: 1, title: "The Great Gatsby", rating: 4, description: "A classic novel about the 1920s."
- id: 2, title: "To Kill a Mockingbird", rating: 3, description: "A novel about racial injustice."
- id: 3, title: "1984", rating: 5, description: "A dystopian social science fiction."
Посмотрите на код ниже и определите, что произойдёт, если мы попытаемся обновить книгу "The Great Gatsby" с новым рейтингом 5 и новым описанием "A classic novel about the American dream.":
Разбор кода:
1. Получение среднего рейтинга всех книг:
- Сначала вычисляется средний рейтинг всех книг в библиотеке с помощью запроса
- В нашем примере средний рейтинг всех книг равен (4 + 3 + 5) / 3 = 4.
2. Поиск книги по названию:
- Следующим шагом программа ищет книгу с названием "The Great Gatsby". Если она найдена, то её данные загружаются для дальнейшей проверки.
3. Проверка условий:
- Программа проверяет три условия:
- Книга существует (она найдена в базе).
- Текущий рейтинг книги меньше нового рейтинга.
- Текущий рейтинг книги меньше среднего рейтинга по библиотеке.
В нашем случае, рейтинг книги "The Great Gatsby" равен 4. Новый рейтинг — 5. Средний рейтинг всех книг — 4.
4. Почему обновление не произойдёт:
- Хотя рейтинг книги меньше нового предложенного значения (4 < 5), он не меньше среднего рейтинга (4 = 4). Это значит, что одно из условий не выполнено, и обновления не будет.
Итог:
Книга "The Great Gatsby" не будет обновлена, так как её текущий рейтинг равен среднему рейтингу всех книг, что не позволяет пройти последнюю проверку.
Правильный ответ:
Ничего не произойдёт, так как не соответствует условиям.
Как это исправить:
Если вы хотите обновить книгу при равенстве рейтинга со средним, можно изменить условие проверки на
Задача:
У вас есть таблица книг в библиотеке, и вы хотите обновить информацию о книге, если её рейтинг ниже нового предложенного значения. Но перед обновлением проверяется ещё одно условие: текущий рейтинг книги должен быть ниже среднего рейтинга всех книг в библиотеке.
Пример данных в таблице:
- id: 1, title: "The Great Gatsby", rating: 4, description: "A classic novel about the 1920s."
- id: 2, title: "To Kill a Mockingbird", rating: 3, description: "A novel about racial injustice."
- id: 3, title: "1984", rating: 5, description: "A dystopian social science fiction."
Посмотрите на код ниже и определите, что произойдёт, если мы попытаемся обновить книгу "The Great Gatsby" с новым рейтингом 5 и новым описанием "A classic novel about the American dream.":
sync def update_book_info(
title: str, new_rating: int, new_description: str
) -> None:
async with session_maker() as session:
avg_rating_stmt = select(func.avg(Book.rating)).correlate_except(Book)
avg_rating = await session.execute(avg_rating_stmt)
avg_rating_value = avg_rating.scalar()
stmt = select(Book).where(Book.title == title)
result = await session.execute(stmt)
book = result.scalar_one_or_none()
if (
book
and book.rating < new_rating
and book.rating < avg_rating_value
):
stmt = (
update(Book)
.where(Book.id == book.id)
.values(rating=new_rating, description=new_description)
)
await session.execute(stmt)
await session.commit()
await update_book_info(
title="The Great Gatsby",
new_rating=5,
new_description="A classic novel about the American dream.",
)
Разбор кода:
1. Получение среднего рейтинга всех книг:
- Сначала вычисляется средний рейтинг всех книг в библиотеке с помощью запроса
avg_rating_stmt = select(func.avg(Book.rating)).correlate_except(Book). Это значение будет использоваться для проверки, может ли рейтинг книги быть обновлён.- В нашем примере средний рейтинг всех книг равен (4 + 3 + 5) / 3 = 4.
2. Поиск книги по названию:
- Следующим шагом программа ищет книгу с названием "The Great Gatsby". Если она найдена, то её данные загружаются для дальнейшей проверки.
3. Проверка условий:
- Программа проверяет три условия:
- Книга существует (она найдена в базе).
- Текущий рейтинг книги меньше нового рейтинга.
- Текущий рейтинг книги меньше среднего рейтинга по библиотеке.
В нашем случае, рейтинг книги "The Great Gatsby" равен 4. Новый рейтинг — 5. Средний рейтинг всех книг — 4.
4. Почему обновление не произойдёт:
- Хотя рейтинг книги меньше нового предложенного значения (4 < 5), он не меньше среднего рейтинга (4 = 4). Это значит, что одно из условий не выполнено, и обновления не будет.
Итог:
Книга "The Great Gatsby" не будет обновлена, так как её текущий рейтинг равен среднему рейтингу всех книг, что не позволяет пройти последнюю проверку.
Правильный ответ:
Ничего не произойдёт, так как не соответствует условиям.
Как это исправить:
Если вы хотите обновить книгу при равенстве рейтинга со средним, можно изменить условие проверки на
book.rating <= avg_rating_value, чтобы включить случаи, когда рейтинг книги равен среднему.🤯5🔥1
Привет, друзья!
Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:
Понедельник (14.10.2024) Дайджест за предыдущую неделю
Вторник (15.10.2024) Знаете ли вы, как использовать Namespace и cgroups для обеспечения изоляции при контейнеризации?
Среда (16.10.2024)
Четверг (17.10.2024) FastAPI 4. Модель пользователя и Alembic
Пятница (18.10.2024) Пятничный кинорелакс
Суббота (19.10.2024) Задача
Воскресенье (20.10.2024) Текстовый разбор задачи
Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе!
С уважением,
Команда канала "Код на салфетке".
#дайджест #материалы #новости #код_на_салфетке
Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:
Понедельник (14.10.2024) Дайджест за предыдущую неделю
Вторник (15.10.2024) Знаете ли вы, как использовать Namespace и cgroups для обеспечения изоляции при контейнеризации?
Среда (16.10.2024)
Четверг (17.10.2024) FastAPI 4. Модель пользователя и Alembic
Пятница (18.10.2024) Пятничный кинорелакс
Суббота (19.10.2024) Задача
Воскресенье (20.10.2024) Текстовый разбор задачи
Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе!
С уважением,
Команда канала "Код на салфетке".
#дайджест #материалы #новости #код_на_салфетке
🔥8
Хотите узнать, как использовать multiprocessing в Python для обхода ограничений GIL?
В одном из прошлых постов мы говорили о том, как GIL ограничивает параллельное выполнение задач. Сегодня посмотрим на практический пример использования модуля multiprocessing.
Здесь GIL не позволит выполнить
- Создается пул из 4 процессов:
- Каждый процесс работает в своей копии интерпретатора, обходя GIL.
- Функция выполняется параллельно на разных ядрах.
Код на салфетке x Кусочки кода
В одном из прошлых постов мы говорили о том, как GIL ограничивает параллельное выполнение задач. Сегодня посмотрим на практический пример использования модуля multiprocessing.
import multiprocessing
def heavy_computation(n):
return sum(i * i for i in range(n))
if __name__ == '__main__':
numbers = [10**7 + i for i in range(4)]
with multiprocessing.Pool(4) as pool:
results = pool.map(heavy_computation, numbers)
print(results)
Здесь GIL не позволит выполнить
heavy_computation в нескольких потоках, так как это CPU-нагруженная задача. Чтобы обойти это ограничение, мы использовали модуль multiprocessing:- Создается пул из 4 процессов:
Pool(4).- Каждый процесс работает в своей копии интерпретатора, обходя GIL.
- Функция выполняется параллельно на разных ядрах.
Код на салфетке x Кусочки кода
🔥9👍2🤩2
Сравнение hashmap C/C++ с dict Python (часть 3)
Автор: Eugene Kaddo
Данная статья продолжит рассмотрение темы отличия hash table C/C++ от dict Python и способов их реализации.
Читать пост в Telegram
Файлы к посту, можно получить в боте по коду: 646514
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Python #Сравнение_Python_и_C #C #C++ #hash_map #hash_table #dict
Автор: Eugene Kaddo
Данная статья продолжит рассмотрение темы отличия hash table C/C++ от dict Python и способов их реализации.
Читать пост в Telegram
Файлы к посту, можно получить в боте по коду: 646514
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Python #Сравнение_Python_и_C #C #C++ #hash_map #hash_table #dict
🔥6🤩2
🐍 Телеграм-канал PythonProgggg 📢
Хотите глубже погрузиться в увлекательный мир программирования на Python? Не ищите дальше, чем телеграм-канал PythonProgggg! 🚀
Присоединяйтесь к нам на https://t.iss.one/PythonProgggg и приготовьтесь к ежедневной порции благ Python! 🎉
🔸 Почему стоит выбрать PythonProgggg?
✅ Образовательный контент: мы предоставляем высококачественный образовательный контент по программированию на Python, начиная от обучающих программ для начинающих и заканчивая продвинутыми концепциями.
✅ Полезные ресурсы: будьте в курсе последних библиотек, фреймворков и инструментов Python. Мы поможем вам найти лучшие ресурсы для улучшения ваших навыков работы с Python.
✅ Взаимодействие с сообществом: присоединяйтесь к активному сообществу энтузиастов Python, где вы можете задавать вопросы, делиться своими знаниями и участвовать в обсуждениях.
✅ Примеры кода: черпайте вдохновение из множества практических примеров кода, которые вы можете изучить и применить в своих собственных проектах.
✅ Будьте в курсе: мы держим вас в курсе последних новостей и тенденций в мире Python, гарантируя, что вы никогда не пропустите важные обновления.
Не упустите возможность стать профессионалом Python! Присоединяйтесь к нам сегодня на https://t.iss.one/PythonProgggg. Вместе раскроем весь потенциал программирования на Python! 🐍💻
Хотите глубже погрузиться в увлекательный мир программирования на Python? Не ищите дальше, чем телеграм-канал PythonProgggg! 🚀
Присоединяйтесь к нам на https://t.iss.one/PythonProgggg и приготовьтесь к ежедневной порции благ Python! 🎉
🔸 Почему стоит выбрать PythonProgggg?
✅ Образовательный контент: мы предоставляем высококачественный образовательный контент по программированию на Python, начиная от обучающих программ для начинающих и заканчивая продвинутыми концепциями.
✅ Полезные ресурсы: будьте в курсе последних библиотек, фреймворков и инструментов Python. Мы поможем вам найти лучшие ресурсы для улучшения ваших навыков работы с Python.
✅ Взаимодействие с сообществом: присоединяйтесь к активному сообществу энтузиастов Python, где вы можете задавать вопросы, делиться своими знаниями и участвовать в обсуждениях.
✅ Примеры кода: черпайте вдохновение из множества практических примеров кода, которые вы можете изучить и применить в своих собственных проектах.
✅ Будьте в курсе: мы держим вас в курсе последних новостей и тенденций в мире Python, гарантируя, что вы никогда не пропустите важные обновления.
Не упустите возможность стать профессионалом Python! Присоединяйтесь к нам сегодня на https://t.iss.one/PythonProgggg. Вместе раскроем весь потенциал программирования на Python! 🐍💻
Приветствую!
Сегодня пятница, а это значит, что настало время для нашего еженедельного кинопоста! На этой неделе мы предлагаем вам погрузиться в мир загадок и таинственных манипуляций. Эта история захватит вас с первых минут и не отпустит до самого конца. Вас ждет увлекательное путешествие в мир гипноза, где границы реальности и иллюзии стираются, оставляя зрителя в постоянном напряжении.
Фильм: Гипнотик
Год: 2024
У детектива Дэнни Рурка похищают 7-летнюю дочь. Преступник был пойман, но девочку найти так и не удалось. Пытаясь справиться с трагедией, опытный коп начинает посещать психотерапевта. Однажды Дэнни и его напарник получают ориентировку на возможное ограбление банка. Прибыв на место, Рурк обращает внимание на подозрительного мужчину, который при помощи кодовых слов начинает контролировать окружающих и пытается осуществить ограбление.
Приятного просмотра и до встречи на следующей неделе с новым кинопостом!
Сегодня пятница, а это значит, что настало время для нашего еженедельного кинопоста! На этой неделе мы предлагаем вам погрузиться в мир загадок и таинственных манипуляций. Эта история захватит вас с первых минут и не отпустит до самого конца. Вас ждет увлекательное путешествие в мир гипноза, где границы реальности и иллюзии стираются, оставляя зрителя в постоянном напряжении.
Фильм: Гипнотик
Год: 2024
У детектива Дэнни Рурка похищают 7-летнюю дочь. Преступник был пойман, но девочку найти так и не удалось. Пытаясь справиться с трагедией, опытный коп начинает посещать психотерапевта. Однажды Дэнни и его напарник получают ориентировку на возможное ограбление банка. Прибыв на место, Рурк обращает внимание на подозрительного мужчину, который при помощи кодовых слов начинает контролировать окружающих и пытается осуществить ограбление.
Приятного просмотра и до встречи на следующей неделе с новым кинопостом!
🔥4
Что выведет этот код? №43
Задача:
Вы разрабатываете API для обработки информации о заказах в интернет-магазине. Требуется создать Pydantic-модель
-
-
Посмотрите на код ниже и выберите, что он выведет:
Задача:
Вы разрабатываете API для обработки информации о заказах в интернет-магазине. Требуется создать Pydantic-модель
Order, которая принимает список товаров, каждый из которых представлен как словарь с полями id и quantity. Используйте Pydantic для преобразования и проверки данных:-
id должен всегда быть строкой;-
quantity — целым числом, и если меньше или равен нулю, должно автоматически подставляться значение по умолчанию — 1.Посмотрите на код ниже и выберите, что он выведет:
🔥2
Что выведет код с изображения? №43
Anonymous Quiz
13%
[Item(id='123', quantity=-5), Item(id='456', quantity=3), Item(id='789', quantity=1)]
25%
[Item(id='123', quantity=1), Item(id='456', quantity=3), Item(id='789', quantity=1)]
8%
[Item(id='123', quantity=5), Item(id='456', quantity=3), Item(id='789', quantity=1)]
54%
ValidationError
🔥3
Вчерашняя задача оказалась не сложной для большинства из вас. Правильный ответ выбрали 67% участников. Давайте разберем подробно, почему именно так и как работает данный код. Это поможет лучше понять тонкости работы Pydantic, особенно с валидацией и обработкой данных в моделях.
Задача:
Вы разрабатываете API для обработки информации о заказах в интернет-магазине. Требуется создать Pydantic-модель
-
-
Код задачи:
**Что происходит в коде?**
1. Класс Item
Для каждого товара в заказе создается отдельный объект
- Преобразование id к строке: К полю
- Проверка quantity на положительное значение: Поле
2. Класс Order
Класс
Передаваемые данные `order_data`
- Первый элемент:
- Поле
- Поле
- Второй элемент:
-
-
- Третий элемент:
- Поле
- Поле
Почему возникает ошибка?
При создании объекта
Правильный ответ:
Таким образом,
Задача:
Вы разрабатываете API для обработки информации о заказах в интернет-магазине. Требуется создать Pydantic-модель
Order, которая принимает список товаров, каждый из которых представлен как словарь с полями id и quantity. Используйте Pydantic для преобразования и проверки данных:-
id должен всегда быть строкой;-
quantity — целым числом, и если меньше или равен нулю, должно автоматически подставляться значение по умолчанию — 1.Код задачи:
from pydantic import BaseModel, Field, ValidationError, field_validator
class Item(BaseModel):
id: str
quantity: int = Field(default=1, gt=0)
@field_validator("id", mode="before")
def id_to_str(cls, v):
return str(v)
class Order(BaseModel):
items: list[Item]
order_data = {"items": [{"id": 123, "quantity": -5}, {"id": "456", "quantity": "3"}, {"id": 789}]}
order = Order(**order_data)
print(order.items)
**Что происходит в коде?**
1. Класс Item
Для каждого товара в заказе создается отдельный объект
Item. Он содержит два поля: id и quantity.- Преобразование id к строке: К полю
id применяется валидатор @field_validator("id", mode="before"). Этот валидатор срабатывает перед основной валидацией и преобразует переданное значение в строку. Это значит, что, например, числовой id 123 автоматически конвертируется в строку "123". Таким образом, независимо от исходного типа данных, id всегда становится строкой.- Проверка quantity на положительное значение: Поле
quantity имеет ограничение gt=0, что означает "должно быть больше нуля". Если в данных указывается значение, не соответствующее этому условию (например, отрицательное число), Pydantic выбрасывает ValidationError. Также quantity имеет значение по умолчанию — 1. Если quantity не указано, автоматически подставится это значение.2. Класс Order
Класс
Order содержит список товаров items, где каждый элемент должен соответствовать модели Item. Благодаря этому, при создании заказа Pydantic автоматически проверяет каждый элемент items и применяет к ним правила, заданные в Item.Передаваемые данные `order_data`
- Первый элемент:
{"id": 123, "quantity": -5}- Поле
id преобразуется в строку "123" с помощью валидатора id_to_str.- Поле
quantity указано как -5, что нарушает условие gt=0 (больше нуля). Поэтому при попытке создать объект Item с такими данными Pydantic выбросит ValidationError.- Второй элемент:
{"id": "456", "quantity": "3"}-
id уже строка, и ваПосмотрим на передаваемые данные:лидатор оставляет его как есть.-
quantity передан как строка "3", но Pydantic автоматически конвертирует её в целое число 3, что удовлетворяет условию gt=0.- Третий элемент:
{"id": 789}- Поле
id преобразуется в строку "789".- Поле
quantity не указано, поэтому используется значение по умолчанию 1.Почему возникает ошибка?
При создании объекта
Order Pydantic проверяет каждый элемент в списке items. Первый элемент нарушает условие gt=0 из-за отрицательного значения quantity, и это приводит к ValidationError. В результате объект Order не создается, и программа останавливается на этом этапе.Правильный ответ:
ValidationErrorТаким образом,
ValidationError помогает нам избежать ошибок при создании заказа с некорректными данными, таких как отрицательное количество. Этот инструмент позволяет создавать более надежные API, автоматически преобразуя и проверяя данные.🔥6🤩1