Python: NewType против TypeAlias. Декомпозиция типов

Поговорим о декомпозиции типов в Python, а также о TypeAlias и NewType!
0:00 Об чём речь
1:12 Декомпозиция
2:25 typing.TypeAlias
4:08 Для чего TypeAlias?
5:36 typing.NewType
10:06 Использовать TypeAlias или NewType?
Мой курс «Хардкорная веб-разработка» - course.to.digital
Книжный клуб:
t.me/t0digital/528
botanim.to.digital/
botanim_to_digital_bot.t.me/
Telegram - t.me/t0digital
ВК - digitalize.team
RuTube - rutube.ru/channel/24802975/ab...
Дзен - dzen.ru/id/6235d32cb64df01e6e...

Пікірлер: 118

  • @fantasy3469
    @fantasy3469 Жыл бұрын

    Мне очень нравятся вот такие короткие ролики, по делу, без воды и очень очень прикладные! Спасибо, Алексей!

  • @user-ku4iu3ed9n
    @user-ku4iu3ed9n Жыл бұрын

    Огонь, как всегда четко, лаконично, понятно и приятно смонтировано) спасибо!

  • @stupid-face
    @stupid-face Жыл бұрын

    Отличное изложение материала, очень полезная инфа! Спасибо Леха :)

  • @stanislavserov8622
    @stanislavserov8622 Жыл бұрын

    Автор, ты не поверишь, но первый раз в жизни мне кто-то нормально и просто объяснил что такое декомпозиция на примере программы. Обычно в книгах это абстрактный термин. Думаю твоя подача материала позволяет расслабиться и по человечески воспринимать инфу :) Благодарю и успехов в развитии канала!

  • @t0digital

    @t0digital

    Жыл бұрын

    О, отлично! Рад, что нашли полезное:)

  • @stanislavserov8622

    @stanislavserov8622

    Жыл бұрын

    @@t0digital ещё хотел предложить идею для канала. Делать код ревью каких-то небольших или средних программ, разбирая как все работает, почему сделано так или иначе, для самых маленьких вобщем, у кого нет опыта.

  • @t0digital

    @t0digital

    Жыл бұрын

    @@stanislavserov8622 да, у меня тоже была такая идея, делал обзор кода loguru, есть на канале. Всё хочу продолжить, но ресурсоёмкая затея:)

  • @stanislavserov8622

    @stanislavserov8622

    Жыл бұрын

    @@t0digital мне бы очень помогли такие видео. Ведь есть путь самому разбираться в коде - это долго и сложно и есть путь что кто-то расскажет и покажет, так в общем интереснее даже. Ну если будут такие новые видео, буду рад )

  • @user-vc2nf9cv8b
    @user-vc2nf9cv8b Жыл бұрын

    Прекрасный ролик мини-лекция, спасибо!)

  • @worldfree1190
    @worldfree1190 Жыл бұрын

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

  • @yodapunishes
    @yodapunishes Жыл бұрын

    А в чем преимущество NewType перед прямым наследованием? class Rub(Decimal): ...

  • @user-sf3vd8gr5x

    @user-sf3vd8gr5x

    Жыл бұрын

    Кода меньше, и он чище. class Rub(Decimal): pass class Usd(Decimal): pass Выглядит как-то более громоздко и уныло... Уныло, потому что сразу в чужом коде не поймёшь, зачем это тут вообще,. Два бессмысленных пустых класса. А пример из видео, кроме всего прочего, сразу говорит о назначении кода и более изящен.

  • @dmitrijf6337
    @dmitrijf6337 Жыл бұрын

    А как всё-таки можно с помощью NewType сделать валидацию значения? Например, чтобы валидными были только значения больше 0?

  • @lellel5521

    @lellel5521

    Жыл бұрын

    С помощью классов)

  • @dmitrijf6337

    @dmitrijf6337

    Жыл бұрын

    Тогда почему сразу не указывать этот кастомный класс в type hinting? Зачем "посредник" в виде NewType?

  • @user-13520sdf
    @user-13520sdf Жыл бұрын

    Пользуюсь давно и не думал, что это тема отдельного видео)

  • @mansur.gabidullin
    @mansur.gabidullin6 ай бұрын

    Спасибо за видео!

  • @ibragiminc8741
    @ibragiminc8741 Жыл бұрын

    оо новый формат, классно!

  • @muhlymak
    @muhlymak Жыл бұрын

    Алексей, даешь больше видосов по данной книге! мне кажется там столько информации что можно каждый день видосы пилить 😁

  • @Gabriel-hg7fl

    @Gabriel-hg7fl

    Жыл бұрын

    Плююююс! Обязательно когда будут мани оформлюсь в книжный клуб, а пока остаётся надеяться на большее количество видосов по книжке))

  • @tigranrostomyan9231

    @tigranrostomyan9231

    Жыл бұрын

    Согласен полностью!!

  • @matthewsantoro5135

    @matthewsantoro5135

    Жыл бұрын

    Так а почему вы не купите и не начнёте её читать ?

  • @Gabriel-hg7fl

    @Gabriel-hg7fl

    Жыл бұрын

    @@matthewsantoro5135 уже прочитал по большей части. Но хотелось бы именно комментарии услышать, обсудить с ребятами, которые шарят. Иначе оно и запоминается хуже и прикладное значение меньшее имеет.

  • @mtigames188
    @mtigames188 Жыл бұрын

    Круто. Спасибо!

  • @qurke5139
    @qurke5139 Жыл бұрын

    Лучший!

  • @user-pi3qm7il2m
    @user-pi3qm7il2m Жыл бұрын

    Как всегда огонь, спасибо за видео! Интересно не будет ли удобнее использовать dataclass и Enum для улучшения читаемости вместо создания TypeAlias и NewType? Сложные вложенные структуры реализовывать через dataclass/pydantic, пример с валютами сделать через Enum.

  • @user-qc8xe9ie8z
    @user-qc8xe9ie8z Жыл бұрын

    Для typing.NewType также можно применять следующий прием: создать функцию, которая принимает входящие данные и валидирует их (например, что Decimal не меньше нуля) и рядом с объявлением этого типа оставить коммент, что получить этот тип можно в вышеописанной функции. Ссылки на pastebin в комментах к 8 главе оставил

  • @user-bw5in2yo7s
    @user-bw5in2yo7s Жыл бұрын

    Пушка-гонка!

  • @user-rd4be1wk2j
    @user-rd4be1wk2j Жыл бұрын

    Я узнал про: 1) TypeAlias, 2) NewType 3) что я дорогой друг))

  • @t0digital

    @t0digital

    Жыл бұрын

    Отлично:)!

  • @SemyonKalyakulin
    @SemyonKalyakulin Жыл бұрын

    А использование TypeAlias не портит изначальное назначение хинтингов, т.е. указывать на тип возвращаемого/принимаемого значения? С алиасом мы закрываем тип величины, но говорим, что из себя представляет эта величина (а блин функцию по идее выполняет правильный нейминг переменных)

  • @limonred5283
    @limonred5283 Жыл бұрын

    Спасибо, четенько, держишь марку.

  • @footballshorts1984
    @footballshorts1984 Жыл бұрын

    Красота ! Но все же, типизация типов с TypeAlias кажется избыточным, не исключаю что через пару версий питона TypeAlias будет задепрекейчен и будем просто писать type_alias = int | str.

  • @vanya909

    @vanya909

    Жыл бұрын

    Не совсем понятно что имелось в виду. Так и сейчас можно писать

  • @anton_medvedev_it_life
    @anton_medvedev_it_life Жыл бұрын

    Алексей, подскажи, сколько у тебя уходит времени на 1 ролик? Я смотрю ты серьезно готовишься. У тебя уже презы пошли :)) Монтажишь сам или есть монтажер? Представляю сколько работы в таком 11 минутном ролике )) Благодарю кстати, за него

  • @t0digital

    @t0digital

    Жыл бұрын

    С появлением книжного клуба количество видео материалов возросло очень сильно (там пачками видосы идут) и теперь коллега помогает с монтажом. такой ролик это суммарно около дня работы - подготовка сценария/презы, съёмка, монтаж, подготовка звука, обложка, тайм коды

  • @sergey8513
    @sergey85132 ай бұрын

    Было бы хорошо еще про TypeVar узнать в этом видео

  • @user-wf9xf8py2x
    @user-wf9xf8py2x Жыл бұрын

    А что за цветовая схема vim у автора?

  • @archie400
    @archie400 Жыл бұрын

    Привет, звук микрофона очень крутой, мягкий. Прям ляпота! Но очень сильно выделяется эхо, которое режет слух. Возможно это только я в своих наушниках заметил, но вот пишу так сказать отзыв на звук. А так все круто)

  • @TheDeatgod
    @TheDeatgod Жыл бұрын

    Отличное видео! Но данный микрофон очень чувствительный и ловит все "взрывные согласные". Для понижения давления на мембрану микрофона, советую приобрести попфильтр либо отодвинуть микрофон.

  • @AlexandrSpirit
    @AlexandrSpirit Жыл бұрын

    Раньше если объект принимал типа None и например str, нужно было использовать Optional[str, None]. Теперь можно str | None. Где нужно использовать Optional или он больше не требуется?

  • @t0digital

    @t0digital

    Жыл бұрын

    Если проект работает на актуальной версии пайтона, то опшнл больше не нужен

  • @AlexandrSpirit

    @AlexandrSpirit

    Жыл бұрын

    @@t0digital На актуальной. Спасибо.

  • @andreiosipov2766
    @andreiosipov2766 Жыл бұрын

    А ведь псевдонимы типов можно создавать без явной аннотации "TypeAlias"? Просто "SomeType = TypeA | TypeB"?

  • @IT_T_

    @IT_T_

    Жыл бұрын

    Нет, получится присваивание к переменной а не к типу

  • @idoodl

    @idoodl

    Жыл бұрын

    Мне тоже так кажется. Коммент выше не понял.

  • @VGCor

    @VGCor

    Жыл бұрын

    @@IT_T_ так в чём разница? Переменной в Пайтон можно присвоить любое значение. К тому же в видосе про типизированный Пайтон Алексей указывал Celsius = int для градусов цельсия.

  • @mateo1.1
    @mateo1.1 Жыл бұрын

    [На заметку видеомэйкера] 5:58 - "Just a kind of magic" полюбившееся словосочетание в ваших видосах. Но в некоторых местах оно начинает звучать неуместно. Спасиобо за coding-просвещение.

  • @t0digital

    @t0digital

    Жыл бұрын

    Почему неуместно:)?

  • @gnompirogov9259
    @gnompirogov9259 Жыл бұрын

    Гранд мерси, полезно, интересно

  • @greeshanka8283
    @greeshanka8283 Жыл бұрын

    было бы неплохо разыграть эту книжку, когда вы её дочитаете в клубе. Стоит она сейчас космических денег, если честно. Я бы вот нереально обрадовался, если выиграл её. Хоть кому-то повезёт)

  • @jamjam3337
    @jamjam3337 Жыл бұрын

    👏👍

  • @andrewbondaryuk
    @andrewbondaryuk Жыл бұрын

    Спасибо за объяснение. P.S. Прикольно. 2023 год в команде python открыли доменные типы, которые существовали в Оракле с махровых времён 😀

  • @kelevra1493
    @kelevra1493 Жыл бұрын

    Что за часы на руке? Модель?

  • @t0digital

    @t0digital

    Жыл бұрын

    Panerai PAM512

  • @kelevra1493

    @kelevra1493

    Жыл бұрын

    @@t0digital Нормас

  • @uicodeuz
    @uicodeuz Жыл бұрын

    Кайф

  • @dmitrysavin9304
    @dmitrysavin9304 Жыл бұрын

    так зачем всё-таки нужен TypeAlias? почему не написать просто `UserNameToId = Mapping[str, int]`

  • @valeriichirkov9207

    @valeriichirkov9207

    Жыл бұрын

    Просто такое же типизирование как и number: int = 0

  • @yodapunishes

    @yodapunishes

    Жыл бұрын

    Видимо чисто как подсказка тайп чекеру, что этот тип объявлен только для типизации и не будет использоваться в рантайме

  • @lellel5521
    @lellel5521 Жыл бұрын

    Не понял немного смысла в NewType, модели на основе классов, как будто бы выглядят более удобными и все проверки внутри классов можно хранить

  • @koteichpiterlive4750
    @koteichpiterlive4750 Жыл бұрын

    Сними что небуть про Codon

  • @nateriver8261
    @nateriver8261 Жыл бұрын

    А какого года издание этой книги?

  • @t0digital

    @t0digital

    Жыл бұрын

    2022, если не ошибаюсь. Второе издание, это важно, там много нового по сравнению с первым

  • @nateriver8261

    @nateriver8261

    Жыл бұрын

    @@t0digital спасибо, а то читал первое 2016 года и там, разумеется, этих тем еще не было

  • @user-us7eb8bi9l
    @user-us7eb8bi9l Жыл бұрын

    Как-то мимо меня прошёл момент, когда Python стал выкатывать ошибки типов на основании хинтингов. Как же утиная типизация и вот это вот всё?

  • @t0digital

    @t0digital

    Жыл бұрын

    Ошибки катит внешний тайп чекер, не интерпретатор

  • @Stor_Man
    @Stor_Man Жыл бұрын

    Что ты думаешь о WSL?

  • @t0digital

    @t0digital

    Жыл бұрын

    Он хорош, рад, что оно есть на винде

  • @markervictor
    @markervictor Жыл бұрын

    Разве при NewType нельзя уже сам тип использовать вместо Decimal и вызывать его собственный конструктор, а не передавать в него объект Decimal?

  • @markervictor

    @markervictor

    Жыл бұрын

    Типа Rub('80.0'), а не Rub(Decimal('80.0'))

  • @t0digital

    @t0digital

    Жыл бұрын

    не понял вопрос

  • @t0digital

    @t0digital

    Жыл бұрын

    а, нет, так не работает

  • @markervictor

    @markervictor

    Жыл бұрын

    Аа, заблуждался, потому что передавал туда литералы обычно, и выглядело будто это прямо тип, а не просто функция, возвращающая аргумент. Спасибо! Действительно удобно, если есть необходимость манипулировать литералами разных типов, которые на самом деле являются одним типом.

  • @FunInstinct

    @FunInstinct

    Жыл бұрын

    Можно, конечно.

  • @fedorindoukaev3361
    @fedorindoukaev3361 Жыл бұрын

    В первый раз, дорогие друзья, встречаю "дорогие друзья" в качестве словосочетания-паразита, дорогие друзья! А за видео лайк, коротко, ясно, полезно, дорогие друзья!

  • @VGCor

    @VGCor

    Жыл бұрын

    Всё дело в замечательном сочетании звуков д и р вначале слов 😅

  • @t0digital

    @t0digital

    Жыл бұрын

    Не считаю это словом-паразитом, дорогие друзья!

  • @VGCor

    @VGCor

    Жыл бұрын

    ​@@t0digital Тоже не считаю это словом-паразитом. Всё дело в том, что это словосочетание-паразит 😁

  • @t0digital

    @t0digital

    Жыл бұрын

    @@VGCor от оно ж как)))

  • @JDM239
    @JDM239 Жыл бұрын

    Не знаю, мне до сих пор типизация в питоне кажется чужеродной(хотя и стало лучше) Если мне нужно типизация я дотнет лучше возьму:)

  • @simongolovinskiy2959
    @simongolovinskiy2959 Жыл бұрын

    Не понимаю, для чего нужна такая подробная аннотация, тоже эту книжку читаю. Не могу переварить всю главу аннотаций. Вроде, и без них норм

  • @MrLotrus

    @MrLotrus

    Жыл бұрын

    Чтобы в сложном проекте количество ошибок уменьшить.

  • @rexby
    @rexby Жыл бұрын

    Никогда так не делал. Ну что ж. Надо когда-то начинать 🤷. Первый!

  • @ruslangabitov5202
    @ruslangabitov5202 Жыл бұрын

    Спасибо за видео. Тяжело назвать эту шнягу полезной. Опять лишнее увеличение сложности изначально красивого и простого языка. Налицо отсутствие целостного подхода. Зачем вводить эти новые слова, когда есть понятие класса? Приведённый пример с валютам будет красивее и более контролируемо реализован на классах.

  • @t0digital

    @t0digital

    Жыл бұрын

    Аннотации типов остаются опциональным в языке, вообще можно ими не пользоваться, если кодовая база маленькая и это какой-то для себя проект. Полноценные классы, определенные через class, для валют, конечно, можно ввести, если в этом есть смысл, если там будет что-то дополнительное, какие-то свои методы, например. Но не всегда это оправдано. Разные языковые конструкции показывают разное назначение строк кода. Объявление класса - значит тут может быть своя логика в нем. А NewType это просто новый тип, чисто для задач типизации. Язык программирования это же язык. Как много оттенков в обычном, например, русском языке. Вроде слово и синоним другого слова, а если разобраться, то несёт какой-то иной оттенок, иной несколько смысл, иной окрас, иную цель

  • @ruslangabitov5202

    @ruslangabitov5202

    Жыл бұрын

    @@t0digital, в отличии от разговорных языков, введение новых конструктов в языки программирования всегда имеют цену. Чем мы платим за этот "сахарок", дублирующий уже существующие концепции? Жиром программ и жиром мозгов программистов, которые из-за избытка возможностей перестают думать об эффективности, понятности и наглядности своих программ. Когда вижу нововведения, анализирую их, как минимум, с двух сторон: 1) можно ли реализовать это нововведение существующими в языке механизмами, 2) насколько станет труд программиста, тестировщика и будущей поддержки написанных программ более легче, быстрее, надежнее. Если ответ на эти вопросы получается, как вы сказали, просто в оттенках, то нововведение смысла не имеет.

  • @fannigurt
    @fannigurt Жыл бұрын

    идентификаторы прекрасно могут быть отрицательными, например у телеги есть отрицательные айдишники пользователей

  • @t0digital

    @t0digital

    Жыл бұрын

    Единственный знакомый мне инструмент, кто так делает. И вангую, что это искусственно добавляемый знак минус, которого нет в хранилище.

  • @itzlaboratory
    @itzlaboratory Жыл бұрын

    Господа, а чем MyType = Dict[str, str] хуже чем MyType: TypeAlias = Dict[str, str] ?

  • @t0digital

    @t0digital

    Жыл бұрын

    Чтобы явно показать, что это алиас типа. PEP 613, если интересно подробнее

  • @karetro9718
    @karetro9718Ай бұрын

    В телеграмм используются отрицательные идентификаторы для групп. Так что пример был не совсем корректный.

  • @t0digital

    @t0digital

    Ай бұрын

    Не факт, что идентификаторы _хранятся_ как отрицательные числа. Использование в API отрицательных чисел может позволять в самом API разделять сущности.

  • @karetro9718

    @karetro9718

    Ай бұрын

    @@t0digital В любом случае при работе с API телеграмма мы имеем дело с отрицательными идентификаторами. Как у них это в базе данных хранится - это дело третье. Для нас-то это все равно идентификаторы, и они - отрицательные числа. Общий смысл ролика понятен, и пример тоже. Не хотелось душнить, просто решил заметить, что всегда отметать отрицательные числа в идентификаторах это неправильно, это может зависеть от ситуации) В любом случае большое спасибо вам за уроки по Python и не только. Всегда ждем с нетерпением. Жаль, что в последнее время редко контентом балуете.

  • @walterwhite4407
    @walterwhite4407 Жыл бұрын

    man,ты гониш

  • @t0digital

    @t0digital

    Жыл бұрын

    Нет не гониш

  • @user-jn4cq9dy3f
    @user-jn4cq9dy3f Жыл бұрын

    Близок тот момент, когда ошибки типа начнут валиться на промежуточной компиляции, чтобы в байткод никакой откровенной ереси не попало... И тогда даже самые ленивые (вроде меня) начнут использовать тайпхинтинг. ;-)

  • @t0digital

    @t0digital

    Жыл бұрын

    Гвидо обещает, что аннотации типов всегда будут опциональными в питоне:)

  • @andrewbondaryuk

    @andrewbondaryuk

    Жыл бұрын

    @@t0digital Жаль. Почему не ввести флаг striсt совершенно не понятно :(

  • @banzaika
    @banzaika Жыл бұрын

    Гггоднота, нннаверноее!

  • @t0digital

    @t0digital

    Жыл бұрын

    скорее всего да!

  • @user-vo2fq6my8x
    @user-vo2fq6my8x Жыл бұрын

    "Python: к вершинам мастерства" - полезная книга?

  • @t0digital

    @t0digital

    Жыл бұрын

    Да. Книга отличная. Но не в качестве первой книги по питону

  • @MIRAMAXED
    @MIRAMAXED Жыл бұрын

    Аннотации типов в том виде, в котором их сейчас активно используют, нарушают первый принцип: Beautiful is better than ugly. Нет ничего плохого в типизации как таковой, но это всё нужно выносить в docstring. ИМХО.

  • @t0digital

    @t0digital

    Жыл бұрын

    Да все что угодно можно назвать ugly

  • @MIRAMAXED

    @MIRAMAXED

    Жыл бұрын

    @@t0digital Всё что угодно, кроме beautiful :D

  • @t0digital

    @t0digital

    Жыл бұрын

    Да весь пайтон ugly. И дзен его ugly

  • @MIRAMAXED

    @MIRAMAXED

    Жыл бұрын

    @@t0digital Где-то тихо грустит Гвидо ван Россум :D

  • @overblaze240
    @overblaze240 Жыл бұрын

    Typescript в питоне) прикольно

  • @MrSmallChe

    @MrSmallChe

    Жыл бұрын

    жабаскрипт головного мозга

  • @alexanderkorshkov1904
    @alexanderkorshkov1904 Жыл бұрын

    3:40 "...хотелось бы вот этот мэппинг кудв-нибудь упаковать и не повторять..." Предлагаю - упаковать и выкинуть из кода нафиг вообще :) Опишите лучше в док-стринге что это за аргумент, чем может быть и зачем нужен. Аннотации никак не заменяют комментарии. На всякий случай - не объясняйте мне, чем хороша строгая типизация. Я начинал программировать на с и плюсах; сам могу объяснить. И когда знакомился с питоном очень удивлялся - как же они, бедняги, типы не указывают? Оказалось, что замечательно без этого обходятся. Практически никогда аннотации не помогали мне читать код, только загромождают его.

  • @shurko

    @shurko

    Жыл бұрын

    Как интересно. Они помогают не читать код, а писать его или рефакторить. Не насажать ошибок пока пишешь. Нет, не замечательно обходятся. Собственно типизация и приходит туда, потому что не обходятся.

  • @koteich_live
    @koteich_live Жыл бұрын

    эта что за годната то такая.......

  • @hoopengo2289
    @hoopengo2289 Жыл бұрын

    сложнаааааа😅

  • @karandalliik
    @karandalliik Жыл бұрын

    Эльвис воскрес?) Да) совсем недавно, решил первый раз очень объемную задачу сначала функционально, а потом все переписал под python oop - вышло четыре рабочих класса на 4к строк, примерно. Очень весело делать такую декомпозицию и каждый день баги искать) Интересная, конечно, тема типов. Пока, только входящие значения проставляю уже часто; удобно видеть на простыне что поступает на вход; а вот с возвратом с метода не всегда вижу пользу. В общем польза есть и в неожиданный момент idle подскажет, что чушь начала происходить и именно и благодаря типам) Вот так вспоминаю себя, 1-2 года назад, когдавообще ни хера ничего толком не знал, и думал: 'что же за ебанько придумал все это?' А щас уже поримаю и все клево помагает. А ведь еще очень, очень много впереди выучить что есть) Код каждый день становится все изящнее, идеальнее!) А к NewType еще несколько методов валидации написать , для страховки))) пока, не понимаю эту тему.

  • @t0digital

    @t0digital

    Жыл бұрын

    Ну просто не допускайте баги - и тогда не надо будет их искать! + типизация, автотесты:)

  • @karandalliik

    @karandalliik

    Жыл бұрын

    ​@@t0digital Спасибо. Было все равно интересно очень. По багам в прошлой задаче ничего не буду рассказывать. Там было серое задание и просто каждый день совершенствовал код по мелочи и искал некоторые зависапия в безконечных циклах, большую часть решил. 5 недель это все продолжалось. В день 8-14 часов проводил у кода) и это с двумя тренировками, иногда, в день. Рассказать все можно уже не кодом, а еще целой простыней) Уверен, у вас и своих таких хватает. А вот за тесты пора тоже браться. Еще ни разу эту тему не трогал.