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

Sdílet
Vložit
  • čas přidán 24. 07. 2024
  • Поговорим о декомпозиции типов в 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...

Komentáře • 118

  • @fantasy3469
    @fantasy3469 Před rokem +27

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

  • @user-ku4iu3ed9n
    @user-ku4iu3ed9n Před rokem +2

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

  • @stupid-face
    @stupid-face Před rokem +5

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

  • @user-vc2nf9cv8b
    @user-vc2nf9cv8b Před rokem +1

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

  • @worldfree1190
    @worldfree1190 Před rokem +2

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

  • @Vjidowkdkcpapqkfjfw
    @Vjidowkdkcpapqkfjfw Před 25 dny

    Благодарность, Алексей!

  • @mansur.gabidullin
    @mansur.gabidullin Před 7 měsíci

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

  • @user-13520sdf
    @user-13520sdf Před rokem

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

  • @ibragiminc8741
    @ibragiminc8741 Před rokem

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

  • @yodapunishes
    @yodapunishes Před rokem +6

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

    • @user-sf3vd8gr5x
      @user-sf3vd8gr5x Před rokem +1

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

  • @mtigames188
    @mtigames188 Před rokem

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

  • @stanislavserov8622
    @stanislavserov8622 Před rokem +8

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

    • @t0digital
      @t0digital  Před rokem

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

    • @stanislavserov8622
      @stanislavserov8622 Před rokem +1

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

    • @t0digital
      @t0digital  Před rokem +1

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

    • @stanislavserov8622
      @stanislavserov8622 Před rokem

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

  • @muhlymak
    @muhlymak Před rokem +11

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

    • @Gabriel-hg7fl
      @Gabriel-hg7fl Před rokem

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

    • @tigranrostomyan9231
      @tigranrostomyan9231 Před rokem

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

    • @matthewsantoro5135
      @matthewsantoro5135 Před rokem

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

    • @Gabriel-hg7fl
      @Gabriel-hg7fl Před rokem +1

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

  • @user-bw5in2yo7s
    @user-bw5in2yo7s Před rokem

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

  • @dmitrijf6337
    @dmitrijf6337 Před rokem +8

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

    • @lellel5521
      @lellel5521 Před rokem

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

    • @dmitrijf6337
      @dmitrijf6337 Před rokem +2

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

  • @user-pi3qm7il2m
    @user-pi3qm7il2m Před rokem

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

  • @qurke5139
    @qurke5139 Před rokem +2

    Лучший!

  • @user-qc8xe9ie8z
    @user-qc8xe9ie8z Před rokem +2

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

  • @limonred5283
    @limonred5283 Před rokem +1

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

  • @user-rd4be1wk2j
    @user-rd4be1wk2j Před rokem +1

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

  • @sergey8513
    @sergey8513 Před 4 měsíci

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

  • @TheDeatgod
    @TheDeatgod Před rokem

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

  • @archie400
    @archie400 Před rokem

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

  • @jamjam3337
    @jamjam3337 Před rokem

    👏👍

  • @SemyonKalyakulin
    @SemyonKalyakulin Před rokem +1

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

  • @footballshorts1984
    @footballshorts1984 Před rokem +3

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

    • @vanya909
      @vanya909 Před rokem

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

  • @gnompirogov9259
    @gnompirogov9259 Před rokem

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

  • @user-wf9xf8py2x
    @user-wf9xf8py2x Před rokem

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

  • @andreiosipov2766
    @andreiosipov2766 Před rokem +3

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

    • @IT_T_
      @IT_T_ Před rokem

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

    • @idoodl
      @idoodl Před rokem

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

    • @VGCor
      @VGCor Před rokem

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

  • @anton_medvedev_it_life

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

    • @t0digital
      @t0digital  Před rokem +2

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

  • @greeshanka8283
    @greeshanka8283 Před rokem

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

  • @mateo1.1
    @mateo1.1 Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

  • @AlexandrSpirit
    @AlexandrSpirit Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

    • @AlexandrSpirit
      @AlexandrSpirit Před rokem

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

  • @uicodeuz
    @uicodeuz Před rokem

    Кайф

  • @andrewbondaryuk
    @andrewbondaryuk Před rokem

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

  • @lellel5521
    @lellel5521 Před rokem

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

  • @dmitrysavin9304
    @dmitrysavin9304 Před rokem +2

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

    • @valeriichirkov9207
      @valeriichirkov9207 Před rokem

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

    • @yodapunishes
      @yodapunishes Před rokem +2

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

  • @user-us7eb8bi9l
    @user-us7eb8bi9l Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

  • @fedorindoukaev3361
    @fedorindoukaev3361 Před rokem +3

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

    • @VGCor
      @VGCor Před rokem +1

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

    • @t0digital
      @t0digital  Před rokem +3

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

    • @VGCor
      @VGCor Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

  • @kelevra1493
    @kelevra1493 Před rokem

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

  • @Stor_Man
    @Stor_Man Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

  • @rexby
    @rexby Před rokem +1

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

  • @markervictor
    @markervictor Před rokem

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

    • @markervictor
      @markervictor Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

    • @markervictor
      @markervictor Před rokem

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

    • @FunInstinct
      @FunInstinct Před rokem

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

  • @simongolovinskiy2959
    @simongolovinskiy2959 Před rokem +1

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

    • @MrLotrus
      @MrLotrus Před rokem

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

  • @fannigurt
    @fannigurt Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

  • @nateriver8261
    @nateriver8261 Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

    • @nateriver8261
      @nateriver8261 Před rokem

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

  • @banzaika
    @banzaika Před rokem

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

  • @walterwhite4407
    @walterwhite4407 Před rokem

    man,ты гониш

  • @itzlaboratory
    @itzlaboratory Před rokem

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

    • @t0digital
      @t0digital  Před rokem +2

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

  • @JDM239
    @JDM239 Před rokem

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

  • @user-vo2fq6my8x
    @user-vo2fq6my8x Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

  • @ruslangabitov5202
    @ruslangabitov5202 Před rokem

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

    • @t0digital
      @t0digital  Před rokem +2

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

    • @ruslangabitov5202
      @ruslangabitov5202 Před rokem +1

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

  • @karetro9718
    @karetro9718 Před 3 měsíci

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

    • @t0digital
      @t0digital  Před 3 měsíci

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

    • @karetro9718
      @karetro9718 Před 3 měsíci

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

  • @overblaze240
    @overblaze240 Před rokem

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

    • @MrSmallChe
      @MrSmallChe Před rokem

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

  • @user-jn4cq9dy3f
    @user-jn4cq9dy3f Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

    • @andrewbondaryuk
      @andrewbondaryuk Před rokem

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

  • @MIRAMAXED
    @MIRAMAXED Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

    • @MIRAMAXED
      @MIRAMAXED Před rokem

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

    • @t0digital
      @t0digital  Před rokem

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

    • @MIRAMAXED
      @MIRAMAXED Před rokem

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

  • @hoopengo2289
    @hoopengo2289 Před rokem

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

  • @koteich_live
    @koteich_live Před rokem

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

  • @alexanderkorshkov1904
    @alexanderkorshkov1904 Před rokem +1

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

    • @shurko
      @shurko Před rokem +1

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

  • @karandalliik
    @karandalliik Před rokem +2

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

    • @t0digital
      @t0digital  Před rokem

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

    • @karandalliik
      @karandalliik Před rokem

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