Обновить
27
350.9
Коммунист Этичный Хакер@enamored_poc

Программист из Казахстана

Отправить сообщение

Плохой рекламы не бывает) Спасибо за упоминания!

Вы абсолютно правы про 10 000 вариантов!

Тут даже не обязательно вводить отдельную формулу размещений с повторениями. Эта задача решается простой логикой из раздела "Правило произведения" (союз И), который я описал в начале статьи:
У нас 4 независимых выбора по 10 вариантов в каждом. Перемножаем их

10×10×10×10

и получаем те самые 10 000.

Зачем мне ставить минус за критику, которая приводит хоть какие то Аргументы? А не просто кричит фу это нейросеть...

Ну так в статье объясняется почему в файлике по другому работает) Прочитай те статью пожалуйста полностью)

А вы запускали через cmd? или в файлике?

Спасибо за ваше развернутое мнение. С вами я полностью согласен.

Действительно какой смысл в обучающих статья? Сам задаюсь этим вопросом, зачем создавать статьи, в которых объясняется какая то важная тема... Я обязательно подумаю)

Здравствуйте, Какие артефакты? У вас претензии именно из за того что статья некачественная или что? Если есть какие то ошибки в статье или не точности, я готов их обсуждать и редактировать статью)

Спасибо за объективное мнение)

А вы можете сказать, что именно в этой статье некачественное, чтобы в будущих статьях я не допускал таких ошибок, заранее благодарен)

Текст действительно "причесывался" инструментами, чтобы убрать воду и ошибки — это уважение к читателю. Но архитектура, код и подход к разделению слоев — это мой опыт, а не галлюцинации нейросети.Если видите технические ошибки или анти-паттерны в коде — давайте обсуждать их предметно. Я здесь ради этого.

Спасибо за комментарий, вопрос отличный и закономерный.

Действительно, Django — прекрасный "батарейный" фреймворк, где многие решения приняты за разработчика. Если задача — быстро поднять стандартную админку и CRUD, Django часто выигрывает.

Однако я не соглашусь с тезисом, что FastAPI — только для маленьких проектов. Структура, которую я описываю, — это не попытка "написать свой фреймворк", а реализация классической Clean Architecture / Layered Architecture.
Мы не изобретаем велосипед, а используем принцип Composition over Inheritance (композиция вместо наследования), который лежит в основе FastAPI.

Почему не Django?

  1. Асинхронность: FastAPI изначально спроектирован под async/await и высокий I/O. Django async догоняет, но тащит огромный синхронный хвост.

  2. Типизация: Связка Pydantic + FastAPI дает строгую валидацию и автодокументацию на уровне типов Python. В Django работа с типами часто менее прозрачна (магия ORM).

  3. SQLAlchemy 2.0: Она дает гораздо больше контроля над SQL-запросами, чем Django ORM, что критично на высоких нагрузках.

Выбор между ними — это выбор между "Convention over Configuration" (Django) и "Explicit is better than implicit" (FastAPI). Эта статья для тех, кто выбрал второй путь и хочет пройти его правильно».

вы абсолютно правы! Пытаться прогнать ETL-пайплайн на миллион записей через Pydantic (или любые Python-объекты в цикле) — это очень плохо. Для таких объемов есть векторные вычисления в Polars/Pandas.

Но у Pydantic другая ниша: это транзакционная логика. Когда к нам прилетает один сложный JSON-запрос на создание заказа со вложенными адресами и списками товаров, нам не нужен DataFrame. Нам нужен строгий валидированный объект, с которым удобно работать в бизнес-логике.

Pydantic — для API и конфигов. Polars — для "молотилок" данных. Инструменты разные, и задачи у них разные.

Спасибо за альтернативное мнение!

  1. Про неявный кастинг: Тут вопрос философии. Когда мы принимаем данные из JSON или query-параметров (где всё — строки), автоматическое приведение типов спасает от написания тонн бойлерплейта. Но если нужна строгость — в Pydantic V2 есть ConfigDict(strict=True), который будет кидать ошибки, как вы и описали.

  2. Про производительность: Вы, вероятно, вспоминаете Pydantic V1. Вторая версия (о которой статья) написана на Rust и в синтетических тестах приблизилась к msgspec (хотя msgspec всё еще быстрее, тут спорить глупо).

1. Спасибо за историческую справку по версии 2.3. Действительно, модуль появился тогда, но с тех пор язык эволюционировал, и в Python 3 концепция итераторов стала фундаментальной (PEP 234).

2. Про TCO: Пожалуйста, поделитесь ссылкой на PEP или release notes CPython, где добавили нативную поддержку TCO. Насколько известно официальной документации и BDFL, в Python оптимизации хвостовой рекурсии нет, и глубокая рекурсия вызывает переполнение стека. Итераторы — единственный безопасный способ обработки больших данных.

Спасибо за внимательность! Вы абсолютно правы насчет разницы алгоритмов.

Пример во введении я привел как самую узнаваемую визуализацию анти-паттерна "Arrowhead" (бесконечные отступы вправо), который знаком всем. А itertools.product привел первым пунктом как самый простой способ избавиться от вложенности в комбинаторных задачах, так как они нагляднее для старта.

Согласен, что переход получился резким. Задачу из введения по-хорошему нужно решать через генераторы или itertools.chain.from_iterable, "выпрямляя" списки команд и сотрудников. Рад, что статью читают вдумчиво, учту этот момент в будущих материалах!

Спасибо за развернутый комментарий! Чувствуется, что вы уже плотно работаете с Poetry 2.0 и новыми стандартами.

Однако цель статьи — помочь новичкам, которые прямо сейчас сидят на requirements.txt и pip, перейти на более удобный инструмент. Подавляющее большинство проектов и туториалов в сети всё ещё используют синтаксис [tool.poetry] (версии 1.x), и именно с ним читатель столкнется в 99% случаев. Грузить их сразу PEP 621 и миграцией на 2.0 — значит отпугнуть сложностью.

По пунктам:

  1. Lock-файл: Для конечных приложений (а статья ориентирована на них, боты/сайты) комитить лок — это best practice. Для библиотек — да, не стоит, но это отдельная тема.

  2. OS: Лок-файл решает проблему версий пакетов. Проблему бинарных сборок под разные архитектуры решает Docker (о чем и сказано в конце).

  3. Python 3.11: Это актуальный LTS релиз, на котором крутится огромная часть продакшена.

Ваше дополнение про Poetry 2.0 очень ценное, оно показывает вектор развития инструмента. Спасибо!

Звучит как суровое, но справедливое код-ревью времен моей стажировки в команде АБТ :) (zaplavs)

Вы абсолютно правы насчет архитектуры серьезных проектов (разделение логики, View и т.д.). Но если я сейчас вывалю на новичка паттерны проектирования, он просто закроет вкладку. Здесь мы намеренно упрощаем (KISS), чтобы человек понял суть self и полиморфизма. А до "серьезной архитектуры" мы с читателями дорастем в следующих статьях!

Вы приводите примеры сложных систем (Heroes, Wesnoth), а мы здесь разбираем алфавит. Конечно, архитектура AAA-стратегии строится иначе (ECS, Event Bus и т.д.). Но нельзя научить человека писать «Войну и мир», пока он не выучил буквы. Этот код — демонстрация базовых принципов (Наследование/Полиморфизм) в вакууме, а не готовый движок для Steam.

1

Информация

В рейтинге
4-й
Откуда
Казахстан
Зарегистрирован
Активность

Специализация

Бэкенд разработчик, Фулстек разработчик
Средний
От 1 ₽
Git
Python
Vue.js
HTML
Sass
PostgreSQL