Python: NewType против TypeAlias. Декомпозиция типов
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...
Мне очень нравятся вот такие короткие ролики, по делу, без воды и очень очень прикладные! Спасибо, Алексей!
Огонь, как всегда четко, лаконично, понятно и приятно смонтировано) спасибо!
Отличное изложение материала, очень полезная инфа! Спасибо Леха :)
Прекрасный ролик мини-лекция, спасибо!)
Вау, не разу о таком не слышал. Очень классная информация. Спасибо!
Благодарность, Алексей!
Спасибо за видео!
Пользуюсь давно и не думал, что это тема отдельного видео)
оо новый формат, классно!
А в чем преимущество NewType перед прямым наследованием?
class Rub(Decimal): ...
Кода меньше, и он чище.
class Rub(Decimal):
pass
class Usd(Decimal):
pass
Выглядит как-то более громоздко и уныло... Уныло, потому что сразу в чужом коде не поймёшь, зачем это тут вообще,. Два бессмысленных пустых класса. А пример из видео, кроме всего прочего, сразу говорит о назначении кода и более изящен.
Круто. Спасибо!
Автор, ты не поверишь, но первый раз в жизни мне кто-то нормально и просто объяснил что такое декомпозиция на примере программы. Обычно в книгах это абстрактный термин. Думаю твоя подача материала позволяет расслабиться и по человечески воспринимать инфу :) Благодарю и успехов в развитии канала!
О, отлично! Рад, что нашли полезное:)
@@t0digital ещё хотел предложить идею для канала. Делать код ревью каких-то небольших или средних программ, разбирая как все работает, почему сделано так или иначе, для самых маленьких вобщем, у кого нет опыта.
@@stanislavserov8622 да, у меня тоже была такая идея, делал обзор кода loguru, есть на канале. Всё хочу продолжить, но ресурсоёмкая затея:)
@@t0digital мне бы очень помогли такие видео. Ведь есть путь самому разбираться в коде - это долго и сложно и есть путь что кто-то расскажет и покажет, так в общем интереснее даже. Ну если будут такие новые видео, буду рад )
Алексей, даешь больше видосов по данной книге! мне кажется там столько информации что можно каждый день видосы пилить 😁
Плююююс!
Обязательно когда будут мани оформлюсь в книжный клуб, а пока остаётся надеяться на большее количество видосов по книжке))
Согласен полностью!!
Так а почему вы не купите и не начнёте её читать ?
@@matthewsantoro5135 уже прочитал по большей части. Но хотелось бы именно комментарии услышать, обсудить с ребятами, которые шарят. Иначе оно и запоминается хуже и прикладное значение меньшее имеет.
Пушка-гонка!
А как всё-таки можно с помощью NewType сделать валидацию значения? Например, чтобы валидными были только значения больше 0?
С помощью классов)
Тогда почему сразу не указывать этот кастомный класс в type hinting? Зачем "посредник" в виде NewType?
Как всегда огонь, спасибо за видео!
Интересно не будет ли удобнее использовать dataclass и Enum для улучшения читаемости вместо создания TypeAlias и NewType? Сложные вложенные структуры реализовывать через dataclass/pydantic, пример с валютами сделать через Enum.
Лучший!
Для typing.NewType также можно применять следующий прием: создать функцию, которая принимает входящие данные и валидирует их (например, что Decimal не меньше нуля) и рядом с объявлением этого типа оставить коммент, что получить этот тип можно в вышеописанной функции. Ссылки на pastebin в комментах к 8 главе оставил
Спасибо, четенько, держишь марку.
Я узнал про:
1) TypeAlias,
2) NewType
3) что я дорогой друг))
Отлично:)!
Было бы хорошо еще про TypeVar узнать в этом видео
Отличное видео! Но данный микрофон очень чувствительный и ловит все "взрывные согласные". Для понижения давления на мембрану микрофона, советую приобрести попфильтр либо отодвинуть микрофон.
Привет, звук микрофона очень крутой, мягкий. Прям ляпота! Но очень сильно выделяется эхо, которое режет слух. Возможно это только я в своих наушниках заметил, но вот пишу так сказать отзыв на звук. А так все круто)
👏👍
А использование TypeAlias не портит изначальное назначение хинтингов, т.е. указывать на тип возвращаемого/принимаемого значения? С алиасом мы закрываем тип величины, но говорим, что из себя представляет эта величина (а блин функцию по идее выполняет правильный нейминг переменных)
Красота ! Но все же, типизация типов с TypeAlias кажется избыточным, не исключаю что через пару версий питона TypeAlias будет задепрекейчен и будем просто писать type_alias = int | str.
Не совсем понятно что имелось в виду. Так и сейчас можно писать
Гранд мерси, полезно, интересно
А что за цветовая схема vim у автора?
А ведь псевдонимы типов можно создавать без явной аннотации "TypeAlias"? Просто "SomeType = TypeA | TypeB"?
Нет, получится присваивание к переменной а не к типу
Мне тоже так кажется. Коммент выше не понял.
@@IT_T_ так в чём разница? Переменной в Пайтон можно присвоить любое значение. К тому же в видосе про типизированный Пайтон Алексей указывал Celsius = int для градусов цельсия.
Алексей, подскажи, сколько у тебя уходит времени на 1 ролик? Я смотрю ты серьезно готовишься. У тебя уже презы пошли :)) Монтажишь сам или есть монтажер? Представляю сколько работы в таком 11 минутном ролике )) Благодарю кстати, за него
С появлением книжного клуба количество видео материалов возросло очень сильно (там пачками видосы идут) и теперь коллега помогает с монтажом. такой ролик это суммарно около дня работы - подготовка сценария/презы, съёмка, монтаж, подготовка звука, обложка, тайм коды
было бы неплохо разыграть эту книжку, когда вы её дочитаете в клубе. Стоит она сейчас космических денег, если честно. Я бы вот нереально обрадовался, если выиграл её. Хоть кому-то повезёт)
[На заметку видеомэйкера]
5:58 - "Just a kind of magic" полюбившееся словосочетание в ваших видосах. Но в некоторых местах оно начинает звучать неуместно.
Спасиобо за coding-просвещение.
Почему неуместно:)?
Раньше если объект принимал типа None и например str, нужно было использовать Optional[str, None]. Теперь можно str | None. Где нужно использовать Optional или он больше не требуется?
Если проект работает на актуальной версии пайтона, то опшнл больше не нужен
@@t0digital На актуальной. Спасибо.
Кайф
Спасибо за объяснение.
P.S. Прикольно. 2023 год в команде python открыли доменные типы, которые существовали в Оракле с махровых времён 😀
Не понял немного смысла в NewType, модели на основе классов, как будто бы выглядят более удобными и все проверки внутри классов можно хранить
так зачем всё-таки нужен TypeAlias? почему не написать просто `UserNameToId = Mapping[str, int]`
Просто такое же типизирование как и number: int = 0
Видимо чисто как подсказка тайп чекеру, что этот тип объявлен только для типизации и не будет использоваться в рантайме
Как-то мимо меня прошёл момент, когда Python стал выкатывать ошибки типов на основании хинтингов. Как же утиная типизация и вот это вот всё?
Ошибки катит внешний тайп чекер, не интерпретатор
В первый раз, дорогие друзья, встречаю "дорогие друзья" в качестве словосочетания-паразита, дорогие друзья! А за видео лайк, коротко, ясно, полезно, дорогие друзья!
Всё дело в замечательном сочетании звуков д и р вначале слов 😅
Не считаю это словом-паразитом, дорогие друзья!
@@t0digital Тоже не считаю это словом-паразитом. Всё дело в том, что это словосочетание-паразит 😁
@@VGCor от оно ж как)))
Что за часы на руке? Модель?
Panerai PAM512
@@t0digital Нормас
Что ты думаешь о WSL?
Он хорош, рад, что оно есть на винде
Никогда так не делал. Ну что ж. Надо когда-то начинать 🤷. Первый!
Разве при NewType нельзя уже сам тип использовать вместо Decimal и вызывать его собственный конструктор, а не передавать в него объект Decimal?
Типа Rub('80.0'), а не Rub(Decimal('80.0'))
не понял вопрос
а, нет, так не работает
Аа, заблуждался, потому что передавал туда литералы обычно, и выглядело будто это прямо тип, а не просто функция, возвращающая аргумент. Спасибо!
Действительно удобно, если есть необходимость манипулировать литералами разных типов, которые на самом деле являются одним типом.
Можно, конечно.
Не понимаю, для чего нужна такая подробная аннотация, тоже эту книжку читаю. Не могу переварить всю главу аннотаций. Вроде, и без них норм
Чтобы в сложном проекте количество ошибок уменьшить.
идентификаторы прекрасно могут быть отрицательными, например у телеги есть отрицательные айдишники пользователей
Единственный знакомый мне инструмент, кто так делает. И вангую, что это искусственно добавляемый знак минус, которого нет в хранилище.
А какого года издание этой книги?
2022, если не ошибаюсь. Второе издание, это важно, там много нового по сравнению с первым
@@t0digital спасибо, а то читал первое 2016 года и там, разумеется, этих тем еще не было
Гггоднота, нннаверноее!
скорее всего да!
man,ты гониш
Нет не гониш
Господа, а чем MyType = Dict[str, str] хуже чем MyType: TypeAlias = Dict[str, str] ?
Чтобы явно показать, что это алиас типа. PEP 613, если интересно подробнее
Не знаю, мне до сих пор типизация в питоне кажется чужеродной(хотя и стало лучше)
Если мне нужно типизация я дотнет лучше возьму:)
"Python: к вершинам мастерства" - полезная книга?
Да. Книга отличная. Но не в качестве первой книги по питону
Спасибо за видео.
Тяжело назвать эту шнягу полезной. Опять лишнее увеличение сложности изначально красивого и простого языка. Налицо отсутствие целостного подхода. Зачем вводить эти новые слова, когда есть понятие класса?
Приведённый пример с валютам будет красивее и более контролируемо реализован на классах.
Аннотации типов остаются опциональным в языке, вообще можно ими не пользоваться, если кодовая база маленькая и это какой-то для себя проект.
Полноценные классы, определенные через class, для валют, конечно, можно ввести, если в этом есть смысл, если там будет что-то дополнительное, какие-то свои методы, например. Но не всегда это оправдано. Разные языковые конструкции показывают разное назначение строк кода. Объявление класса - значит тут может быть своя логика в нем. А NewType это просто новый тип, чисто для задач типизации. Язык программирования это же язык. Как много оттенков в обычном, например, русском языке. Вроде слово и синоним другого слова, а если разобраться, то несёт какой-то иной оттенок, иной несколько смысл, иной окрас, иную цель
@@t0digital, в отличии от разговорных языков, введение новых конструктов в языки программирования всегда имеют цену. Чем мы платим за этот "сахарок", дублирующий уже существующие концепции? Жиром программ и жиром мозгов программистов, которые из-за избытка возможностей перестают думать об эффективности, понятности и наглядности своих программ.
Когда вижу нововведения, анализирую их, как минимум, с двух сторон: 1) можно ли реализовать это нововведение существующими в языке механизмами, 2) насколько станет труд программиста, тестировщика и будущей поддержки написанных программ более легче, быстрее, надежнее.
Если ответ на эти вопросы получается, как вы сказали, просто в оттенках, то нововведение смысла не имеет.
В телеграмм используются отрицательные идентификаторы для групп. Так что пример был не совсем корректный.
Не факт, что идентификаторы _хранятся_ как отрицательные числа. Использование в API отрицательных чисел может позволять в самом API разделять сущности.
@@t0digital В любом случае при работе с API телеграмма мы имеем дело с отрицательными идентификаторами. Как у них это в базе данных хранится - это дело третье. Для нас-то это все равно идентификаторы, и они - отрицательные числа. Общий смысл ролика понятен, и пример тоже. Не хотелось душнить, просто решил заметить, что всегда отметать отрицательные числа в идентификаторах это неправильно, это может зависеть от ситуации)
В любом случае большое спасибо вам за уроки по Python и не только. Всегда ждем с нетерпением. Жаль, что в последнее время редко контентом балуете.
Typescript в питоне) прикольно
жабаскрипт головного мозга
Близок тот момент, когда ошибки типа начнут валиться на промежуточной компиляции, чтобы в байткод никакой откровенной ереси не попало... И тогда даже самые ленивые (вроде меня) начнут использовать тайпхинтинг. ;-)
Гвидо обещает, что аннотации типов всегда будут опциональными в питоне:)
@@t0digital
Жаль. Почему не ввести флаг striсt совершенно не понятно :(
Аннотации типов в том виде, в котором их сейчас активно используют, нарушают первый принцип: Beautiful is better than ugly. Нет ничего плохого в типизации как таковой, но это всё нужно выносить в docstring. ИМХО.
Да все что угодно можно назвать ugly
@@t0digital Всё что угодно, кроме beautiful :D
Да весь пайтон ugly. И дзен его ugly
@@t0digital Где-то тихо грустит Гвидо ван Россум :D
сложнаааааа😅
эта что за годната то такая.......
3:40 "...хотелось бы вот этот мэппинг кудв-нибудь упаковать и не повторять..."
Предлагаю - упаковать и выкинуть из кода нафиг вообще :)
Опишите лучше в док-стринге что это за аргумент, чем может быть и зачем нужен. Аннотации никак не заменяют комментарии.
На всякий случай - не объясняйте мне, чем хороша строгая типизация. Я начинал программировать на с и плюсах; сам могу объяснить. И когда знакомился с питоном очень удивлялся - как же они, бедняги, типы не указывают? Оказалось, что замечательно без этого обходятся. Практически никогда аннотации не помогали мне читать код, только загромождают его.
Как интересно. Они помогают не читать код, а писать его или рефакторить. Не насажать ошибок пока пишешь. Нет, не замечательно обходятся. Собственно типизация и приходит туда, потому что не обходятся.
Эльвис воскрес?)
Да) совсем недавно, решил первый раз очень объемную задачу сначала функционально, а потом все переписал под python oop - вышло четыре рабочих класса на 4к строк, примерно.
Очень весело делать такую декомпозицию и каждый день баги искать)
Интересная, конечно, тема типов. Пока, только входящие значения проставляю уже часто; удобно видеть на простыне что поступает на вход; а вот с возвратом с метода не всегда вижу пользу.
В общем польза есть и в неожиданный момент idle подскажет, что чушь начала происходить и именно и благодаря типам)
Вот так вспоминаю себя, 1-2 года назад, когдавообще ни хера ничего толком не знал, и думал: 'что же за ебанько придумал все это?'
А щас уже поримаю и все клево помагает.
А ведь еще очень, очень много впереди выучить что есть)
Код каждый день становится все изящнее, идеальнее!)
А к NewType еще несколько методов валидации написать , для страховки))) пока, не понимаю эту тему.
Ну просто не допускайте баги - и тогда не надо будет их искать!
+ типизация, автотесты:)
@@t0digital
Спасибо.
Было все равно интересно очень.
По багам в прошлой задаче ничего не буду рассказывать.
Там было серое задание и просто каждый день совершенствовал код по мелочи и искал некоторые зависапия в безконечных циклах, большую часть решил.
5 недель это все продолжалось.
В день 8-14 часов проводил у кода) и это с двумя тренировками, иногда, в день.
Рассказать все можно уже не кодом, а еще целой простыней)
Уверен, у вас и своих таких хватает.
А вот за тесты пора тоже браться. Еще ни разу эту тему не трогал.