4 совета как ЛУЧШЕ применять TypedDict в Python

Поділитися
Вставка
  • Опубліковано 12 чер 2024
  • ⭐ Курс ООП и Приват канал: www.zproger-school.com/?...
    ⭐ Размещайте свои проекты на доступных серверах Vscale: slc.tl/0cf06
    ⭐ Телеграм канал: t.me/+4BVQJYsr8-o2OWNh
    В данном видео рассмотрим главные минусы Python dict. Использование фишек из видео позволяет отслеживать типизацию Python словарей и обнаруживать ошибки в проектах еще на этапе написания кода.
    Такой подход улучшает безопасность приложений и сокращает время его разработки.
    📁 Github: github.com/Zproger
    📁 Все плейлисты с уроками: bit.ly/39GaY89
    📁 Связаться со мной: zproger777@gmail.com
    📁 Поддержать канал: github.com/Zproger/donate
    📁 Исходный код: скоро
    Тайм-коды:
    0:00 - Какие есть недостатки у python dict?
    2:23 - Недостатки с dict типизацией python
    2:50 - 1. Как TypedDict решает все это?
    3:43 - Интеграция Selectel
    4:29 - 2. Как TypedDict делает код более явным?
    5:29 - 3. Преимущества TypedDict над Python dict
    7:58 - 4. Динамический код с TypedDict в Python

КОМЕНТАРІ • 77

  • @BadekYO
    @BadekYO 4 місяці тому +8

    Если есть возможность затащить в проект пайдантик зависимостью, то это, как по мне, будет куда удобнее и полезнее. Чисто для аннотации словарей, скорее всего, можно использовать TypedDict, но я практически не встречал его в каких-то популярных опенсорсных проектах, если нужна ванила, то отдал бы предпочтение датаклассам.

  • @molochnikzero
    @molochnikzero 4 місяці тому +21

    Зачем добавлять в свой код строгую типизацию и потом костылями её обходить, если можно просто использовать для таких целей датаклассы, которые легче и проще? А в случаях, когда тебе действительно нужно валидировать json\xml\protobuf, то есть pydantic или marshmallow (для xml - xmltdict + что-то из вышесказанного), которые имеют для валидации больше возможностей

    • @zproger
      @zproger  4 місяці тому +1

      Потому что датаклассы и TypedDict это совершенно разные вещи и нужны для разных ситуаций. Иногда нужен dataclass, иногда Enum, а иногда TypedDict, и не получится всегда применять одно и тоже.

    • @zproger
      @zproger  4 місяці тому +3

      Вижу комментарий был изменен. Ну в целом если речь о pydantic, тогда да, но все же иногда проще сделать типизированный словарь. Все зависит от ситуации.

    • @egorkorotaev6848
      @egorkorotaev6848 4 місяці тому

      например?@@zproger

    • @plathardstuck28
      @plathardstuck28 4 місяці тому +2

      Наверное не стоит в принципе обращаться к словарю по ключу без .get()

    • @user-rf4fy7dp7b
      @user-rf4fy7dp7b 4 місяці тому +1

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

  • @krylovilya1
    @krylovilya1 4 місяці тому +11

    Нужно сравнение TypedDict, NamedTuple, и Dataclass

  • @al3kse190
    @al3kse190 4 місяці тому +1

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

  • @zvd1660
    @zvd1660 4 місяці тому +4

    И чем лучше датакласов тогда? Какое-то среднее нечто между датакласом и диктом

  • @user-eh8jh4cd2t
    @user-eh8jh4cd2t 4 місяці тому +1

    Подскажите пожалуйста название темы, которая стоит у вас в PyCharm, эта комбинация цветов бесподобна 😍

  • @shakapaker
    @shakapaker 4 місяці тому

    У меня один вопрос, если я принимаю JSON с бэка то что мне нужно использовать?

  • @errores-me6yu
    @errores-me6yu 4 місяці тому +1

    Привет, что за дистрибутив линукс у тебя стоит? как поставить такой же? чтобы внешний вид был такой, сверху оперативка, цпу градусы и %?

    • @zproger
      @zproger  4 місяці тому +1

      Привет, будет видео на канале, еще не доделал оболочку

    • @errores-me6yu
      @errores-me6yu 4 місяці тому

      @@zproger жду!!

  • @user-it3yo1sn6i
    @user-it3yo1sn6i 4 місяці тому

    А такая аннотация подойдет?
    -> dict[Union[str, int], Any]

  • @kuanishpobedin4463
    @kuanishpobedin4463 4 місяці тому +1

    Используешь visual studio code? Или его опенсорс аналог?

    • @zproger
      @zproger  4 місяці тому +1

      это Pycharm

    • @shakapaker
      @shakapaker 4 місяці тому

      он же и так опенсурс?

  • @agrima9845
    @agrima9845 4 місяці тому +1

    Я только что искал информацию про словари, и пришло в тг уведомление о новом видео. И какая же тема? 😄 Совпадение?) Спасибо)

  • @user-jh9vd1xo4g
    @user-jh9vd1xo4g 2 місяці тому

    А что за IDE ты юзал в видеве?

  • @yatagarashy1669
    @yatagarashy1669 4 місяці тому

    как ты сделал такую красивую верхнюю шторку? где показывается кол-во рабочих столов, температура, цп и тд? и какой у тебя дистрибутив

    • @zproger
      @zproger  4 місяці тому

      Это polybar, дистрибутив arch linux

  • @user-wn4nj6lq9q
    @user-wn4nj6lq9q 4 місяці тому +1

    Интересно)

    • @zproger
      @zproger  4 місяці тому

      Благодарю!

  • @andynaz7044
    @andynaz7044 3 місяці тому

    хорошо преподнёс, спасибо

    • @zproger
      @zproger  3 місяці тому

      Благодарю

  • @nikolayohanyan4606
    @nikolayohanyan4606 4 місяці тому

    Привет . берётесь ли вы за написание индикаторов и соединения с криптобиржами на Питоне?

    • @zproger
      @zproger  4 місяці тому

      На данный момент нет

  • @RimmieEkworg
    @RimmieEkworg 4 місяці тому

    Бро это Arch ? какой wm используешь ?

  • @samezarus
    @samezarus 4 місяці тому +1

    спасибо, не знал 😢

    • @zproger
      @zproger  4 місяці тому +1

      Рад что был полезен

  • @restranger5014
    @restranger5014 4 місяці тому

    Что у тебя за терминал? И что за шрифт в полибаре?

    • @zproger
      @zproger  4 місяці тому

      Alacritty + JetBrains

  • @hophip2955
    @hophip2955 4 місяці тому +1

    Может странный вопрос - зачем пользоваться ТАйпед Дикт если есть датаклассы?

    • @zproger
      @zproger  4 місяці тому +1

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

    • @hophip2955
      @hophip2955 4 місяці тому

      Или например модели pydentic?

    • @hophip2955
      @hophip2955 4 місяці тому

      @@zproger Имели ли вы когда нибудь такие кейсы, в каких случаях мможет такое случаться ?

    • @zproger
      @zproger  4 місяці тому +1

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

    • @vryaboshapko
      @vryaboshapko 4 місяці тому

      @@zproger то есть, TypedDict нужен как прослойка между, условно, легаси, работающем на словарях, и новым кодом? Просто новый код как раз проще написать сразу на дата классах или pydantic/attrs.

  • @aillapur
    @aillapur 4 місяці тому

    А что если сразу использовать класс? 😌

  • @Smbrine
    @Smbrine 3 місяці тому

    ОРМка для словарей, гениально! xD

  • @user-xm6wi7cc9u
    @user-xm6wi7cc9u 4 місяці тому

    а это работает быстрее обычных словарей? если да и скорость выполнения существенная то смысл есть иначе жопоболь

    • @zproger
      @zproger  4 місяці тому

      Тут фишка немного в другом, по скорости это не будет работать быстрее, но если вы допустите ошибку с обычными словарями и с TypedDict, то на устранение потребуется разное время. И уже тут вы выиграете в скорости за счет удобства работы с типизированным словарем.

    • @user-xm6wi7cc9u
      @user-xm6wi7cc9u 4 місяці тому

      @@zproger это смотря какая задача. В своих проектах я обычно упираюсь в скорость выполнения.

  • @user-fi8zc9ph3o
    @user-fi8zc9ph3o 4 місяці тому +2

    Сделай видео о том, как ты настроил vs code и linux, выглядит очень классно))

    • @zproger
      @zproger  4 місяці тому +3

      Это дефолтный PyCharm. Про линукс планируется видео, спасибо.

    • @d.I.m.a.s256s
      @d.I.m.a.s256s 4 місяці тому +1

      @@zprogerу меня выглядит по другому, я так понял это другой стиль ?

    • @vryaboshapko
      @vryaboshapko 4 місяці тому +2

      @@d.I.m.a.s256s это новый UI, появился с 2023, кажется, версии. В настройках ищется по New UI.

  • @ankhmarcius8331
    @ankhmarcius8331 4 місяці тому

    точно pydantic, пару недель назад смотрел как подобным способом проверяли валидность приходящих данных для FastAPI

  • @dyvniy_vershitel
    @dyvniy_vershitel 4 місяці тому

    Питон всё больше скатывается в переусложнённость.
    Лично мне он нравится как простой скриптовый язык вроде LUA.

    • @andynaz7044
      @andynaz7044 3 місяці тому

      для таких, как ты, он остался простым -- пиши, как раньше

  • @SeliverstovMusic
    @SeliverstovMusic 4 місяці тому

    По мне их очень редко используют ибо не нужно.
    Даже именованные кортежи чаще используют

  • @ayattelzhanov9888
    @ayattelzhanov9888 4 місяці тому

    Хочу перейти на rust😅. Но блин уже столько пройдено. Заного начинать мой раздутый пэт проект - не охота🥲

    • @zproger
      @zproger  4 місяці тому +1

      Бывает)

  • @topevgn5914
    @topevgn5914 4 місяці тому +1

    зачем это все если есть pydantic

    • @andynaz7044
      @andynaz7044 3 місяці тому

      затем, что не всегда он доступен

  • @Djdjdjdjmemeo
    @Djdjdjdjmemeo 4 місяці тому +2

    Этот "эм" это фишка чтоли?🥲🥲

  • @user-mc5ld4eb5s
    @user-mc5ld4eb5s 4 місяці тому

    pydantic привет

  • @nakamasama
    @nakamasama 4 місяці тому +1

    Какой-то бред. Я никогда не видел смысла в пакете typing. Если нужен словарь - ты будешь использовать словарь. Если нужен класс - будешь использовать класс. Я спокойно создавал классы, а потом просто обращался к их свойствам. И все вот эти надстройки и поверхностые оболочки над базовыми структурами данных зачастую не нужны. Этих двох структур достаточно с головой. А если кто-то допускает ошибки - он просто новичок, который меньше месяца учит язык и почти ничего не знает о технологиях проектирования, архитектуры ПО, сборки и т.д. Разработчик с опытом 6-9 месяцев и больше не будет допукать никогда таких ошибок, которые были описаны в начале ролика (за исключением случаев, если разработчик не спал два дня, работает больше 20 часов подряд и очень хочет спать). В крайнем случае, кто мне мешает перейти к функции и посмотреть, какой словарь ей возвращается??? Это будет проблемой только для тех, кто не умеет анализировать чужой код или для тех, кому лень потратить 1-8 секунд на просмотр структуры словаря...

    • @zproger
      @zproger  4 місяці тому

      Типизация очень важна, и элементарное добавление таких аннотаций избавляет от огромного количества ошибок еще на этапе статики, не зря все крупные проекты с ног до головы пропитаны typing, mypy, pyright и т.д.
      Фишка типизации именно в том, что статические анализаторы будут ловить возможные ошибки еще только на этапе их формирования, и это исключает шанс того, что эта ошибка обнаружится именно на рантайме.

    • @nakamasama
      @nakamasama 4 місяці тому

      @@zproger , я знаю, что типизация важна. Я ввиду имел, что для типизации достаточно обычного dict (если говорить о словаре). Как ты наводил пример
      def some_function() -> dict:
      return {"res": 5}
      Если ты сомневаешься в типе - перейди в функцию и посмотри какого типа значение ключа. Ну или если получаешь ошибку - конвертируй тип
      print("Result is " + str(some_function["res"]))
      а ещё лучше в этом примере написать
      print(f"Result is {some_function["res"]}")
      в этом случае все типы сами конвертируются, как нужно Питону.
      Я понимаю, что это самые простые примеры, но такой принцип работает в проекте любой сложности. Если вся проблема в незнании типа, не проще ли его просто посмотреть в функции или где ещё?
      Я знаю, что словарь может изменятся в процессе работы и в одно время там может храниться значение одного типа, а потом - другого. В этом случае проще переводить все занчения в тип строк. По этому в словаре для всех ключей всегда будут храниться строки. А потом можно строку конвертировать в нужный тип.
      Я просто хотел донести смысл, что нет нужды использовать какие-то обёртки над стандартными Питоновскими типами. Может для какого-то единствееного уникального проекта и будет смысл использовать "специализированную" бибилотеку, которая реализует такие типы, которых нет в Питоне. Но если язык даёт возможность типизировать переменные - лучше использовать возможности самого языка, а не какого-то модуля.
      Я сторонник такого программирования, где минимизируются сторонние библиотеки. Я по максимуму выжымаю ресурсы самого языка и если уже чего-то нет в языке - только потом обращаюсь к библиотекам.

    • @andynaz7044
      @andynaz7044 3 місяці тому

      @@nakamasama какую чушь ты написал! typing -- это самый что ни на есть стандартный модуль, а не "специализированный"

    • @user-yg7hq4dd1w
      @user-yg7hq4dd1w 3 місяці тому

      Понимаю, что комменту уже месяц, но все же.
      В идеальном мире мы все пишем сами, с нуля, да на чистой архитектуре. А в ральности случается конфиг на UserDict с парой сотней опций)))
      Еще один случай. Есть софтинка с очень мощным python api. Только вот сделано оно через парочку интерфейсов для совместимости с питоновскими типами. В итоге получаем автосгенерированную документацию на пару тысяч классов и обсолютное отсутствие какого либо code completion. Очень весело ловить None'ы-нежданчики в рантайме. Ну или пытаться угадывать какой из наследников "struct_base" хочет та или иная функция на вход 👍
      Так же над одним и тем же кодом может работать несколько людей. Типы это, считай, половина документации к коду.
      Модуль typing заставляет тебя думать о своих структурах данных. А это 1) полезно для тебя 2) полезно для тех кто твой код читает 3) открывает путь для pylance, mypy, pytype 4) упрощат написание/генерацию доков. Это слишком круто, чтобы игнорить

  • @RVS89
    @RVS89 4 місяці тому

    А для чего так перегружать код, когда можно просто посмотреть что от тебя требует словарь. Ведь посмотреть тебе нужно только один раз. А пайтону потом всю жизнь обрабатывать эти лишние строчки кода на сервере. Нужно же наоборот учиться писать код как можно проще для Интерпретатора так как она будучи загружена на сервер, будет выполнять код, а не для того чтобы там сэкономим 5 секунд своего времени.

    • @vryaboshapko
      @vryaboshapko 4 місяці тому

      Мы живём в эпоху, когда машиночасы стоят на порядки дешевле, чем человекочасы. Так что если мы не говорим о высоких нагрузках, то сэкономить 5 секунд себе - это лучше, чем сэкономить 5 наносекунд машине. А высокие нагрузки - это уже совсем другая история.
      Но вообще все эти аннотации с типами отбрасываются после компиляции в байткод, так что на запущенном приложении они не несут дополнительной нагрузки.

  • @clutch3171
    @clutch3171 4 місяці тому

    не совсем понял почему стринга стала интом в последнем TypeVar ? group[1]

    • @andynaz7044
      @andynaz7044 3 місяці тому

      потому что он специально так написал