Инвариантность, ковариантность и контравариантность на примере Python

Поділитися
Вставка
  • Опубліковано 13 чер 2024
  • Поговорим о насущном! Инвариантность, ковариантность и контравариантность на примере Python:)
    0:00 Вариантность
    3:01 Иерархия классов
    5:06 Ковариантность
    7:05 Инвариантность
    10:32 Контравариантность
    15:21 Резюме
    Мой курс «Хардкорная веб-разработка» - course.to.digital
    Книжный клуб:
    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...

КОМЕНТАРІ • 95

  • @user-jr3iv3ny9c
    @user-jr3iv3ny9c Рік тому +46

    Браво, Алексей! Так филигранно завуалировать под видео о вариантности мысль что фронтэндеры не программисты - это достойно))) Шутка!

    • @bukanaka
      @bukanaka Рік тому

      Ах ты ж бэкендер😂

    • @KoichiHub
      @KoichiHub Рік тому

      При чем через ошибку, что программисты не фронтендеры

  • @alexdzehil7194
    @alexdzehil7194 Рік тому +9

    Как Александр люто плюсую за алгоритм начисления зарплаты🤣

  • @P7Vagrant
    @P7Vagrant Рік тому +2

    Я для простоты понимания зафиксировал себе так:
    1. Инвариантность - стоим на месте (для ассоциации - на линии, inline). То есть указываем тип в коде и дальше этого типа никуда не можем двигаться. Представляем иерархию типа и мы на одной из точек, стоим на одной линии.
    2. Ковариантность - можем двигаться по типам вниз по иерархии (Кова... - можно ассоциировать с Копать).
    3. Контрвариантность - Двигаемся по типам вверх, к родителям типа (ассоциация - Контр, то есть противоположность, то есть как копать, только наоборот 😊).
    Возможно кому-то будет полезна такая заметка.
    P.S.: Спасибо за видео! Очень познавательно и доступно!

    • @chu_ri5470
      @chu_ri5470 Рік тому

      Дополнение.
      Инвариантность не обязательно должна быть типовая. То есть, если у тебя есть переменная месяцДляОтпуска, то её значение не может быть отрицательным или 123. Только [0..12] Даже если речь о инте. Иначе лучше её как то переименовать и дополнительно пояснить.
      Более того попытка все типы обернуть в классы/enum/синтаксис приведёт вас к более страшным последствиям. Особенно в Питоне из-за не самой удобной работы с интерфейсами и наследованием.

  • @d1z3ro
    @d1z3ro Рік тому +14

    Как будто-бы изменилась подача и, однозначно, в лучшую сторону! Лайк однозначно

  • @valk9819
    @valk9819 Рік тому +1

    Круто, все четко без воды и с примерами. На пальцах показал за что лайк и питонячее спасибо.

  • @OlViktorovich
    @OlViktorovich Рік тому +5

    Прям актуально, типизация страшная сила ... Спасибо

  • @filippov_es
    @filippov_es Рік тому +3

    Какая прелесть! Очень интересно, спасибо большое!

  • @Keriokutori
    @Keriokutori Рік тому +7

    контравариантность - это когда программист делает задачу, которую должен делать сотрудник. Как же это знакомо)))

    • @oguretsagressive
      @oguretsagressive Місяць тому

      Это контрпродуктивность 😁

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

    Спасибо за видос. Сидел читал википедию и какие-то статьи и была каша в голове была. После видоса сразу все встало на места.

  • @alittlemoron4068
    @alittlemoron4068 Рік тому +4

    Очень полезное видео. Вообще, я знал про все эти делегаты, контейнеры, но не представлял, что в питоне, таком необязательном для типизации языке, оно используется, и столкнулся с этим сразу на Generic'ах в TypeVar. Было очень послушать эту тему именно на примере питона

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t Рік тому

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

  • @samvelsafaryan4698
    @samvelsafaryan4698 Рік тому +2

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

  • @maksimkuznetsov2132
    @maksimkuznetsov2132 23 дні тому

    Привет, сидел на работе. Все было неплохо.
    И тут попалось это видео, и меня на середине вырубило. Очнулся через пару часов

    • @t0digital
      @t0digital  23 дні тому +1

      Что может быть лучше здорового послеобеденного сна!

  • @Maniakalochka
    @Maniakalochka Рік тому +2

    Ничегошеньки не понял, но очень интересно))
    Отложу видео на потом, сейчас не хватает знаний

  • @MadMike93
    @MadMike93 Рік тому

    на предыдущей работе в тайп хинтах ковариативность использовали в модуле который конфиги грузил разных классов в зависимости от переменной окружения ENVIRONMENT))) ну тип был базовый класс и куча дочек local, dev, testing, test, stage prod)))

  • @moowmotors
    @moowmotors Рік тому

    ТОП!

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t Рік тому

    Этак, неявное преобразование типов для ссылок на иммутабельные структуры не работает… а если будет неконстант, также инвариант по ссылкам сохранится?..

  • @TheDeatgod
    @TheDeatgod Рік тому

    Если в примере с инвариантностью я сделаю programmers_list = frontenders_list.copy(), то при добавлении элементов в любой из списков результат операции не отразится на втором списке. Очевидно, что frontenders_list и frontenders_list.copy() имеют один и тот же тип.

  • @MrNagios
    @MrNagios Рік тому

    Good evening Ozzy

  • @DES2048
    @DES2048 9 місяців тому

    Если очень простыми словами:
    Инвариантность - можно присвоить именно тот тип, который указан
    Ковариантность - тип и его потомков
    Контрвариантность - тип его и предков

  • @jamjam3337
    @jamjam3337 Рік тому

    👏

  • @uicodeuz
    @uicodeuz Рік тому +2

    Кайф

  • @VGCor
    @VGCor Рік тому +1

    Типизация непростая тема. Никак не врублюсь почему типы раскиданы по модулям разным, когда есть вроде специальный typing. Нужен тебе какой, то по всему питону ищи... Тему видоса вообще понял только к резьюме 15:50 😂

  • @sad0FFsky
    @sad0FFsky Рік тому

    Алексей, как попасть к вам на курс?когда он стартует?

    • @t0digital
      @t0digital  Рік тому

      Курс ещё не запущен. Подпишитесь на телеграм, там будет вся информация t.me/t0digital

    • @sad0FFsky
      @sad0FFsky Рік тому

      @@t0digital а примерные сроки запуска известны?

  • @user-cw3ui3je5g
    @user-cw3ui3je5g Рік тому +2

    Браво. Топ канал.

  • @JillOverlord
    @JillOverlord Рік тому

    Пример для инвариантности заставил удивиться. Пальцы всегда сами бьют "from typing import List"... :)

  • @Skeap11
    @Skeap11 Рік тому +2

    Возможно я не въехал, но кажется, что пример про контравариативность некорректный т.к. аннотация аргументов функция работает ковариативно т.к. task_for_employee принимает Employee и его наследников.

    • @user-vc2nf9cv8b
      @user-vc2nf9cv8b 10 місяців тому +2

      тоже думаю об этом и ломаю голову........

    • @oguretsagressive
      @oguretsagressive Місяць тому

      Все-таки корректный, просто здесь только аргумент "task" контравариантный (подходят функции со всем что выше по иерархии). Аргументы для "task_for_*" ковариантные ("Programmer" и ниже по иерархии).

  • @user-qs4fv5ui5j
    @user-qs4fv5ui5j 7 місяців тому +1

    Разве инвариантность и контрвариантность не противоречат принципу подстановки Лисков?

    • @t0digital
      @t0digital  7 місяців тому

      Неа. Если интересна тема, задайте вопрос конкретнее

    • @user-qs4fv5ui5j
      @user-qs4fv5ui5j 7 місяців тому +1

      @@t0digital ну вот такое видел:
      Этот принцип говорит нам о том, что если класс Sub является подтипом класса Sup, тогда в программе объекты типа Sup должны легко заменяться объектами типа Sub без необходимости изменения кода.
      А Инвариантность нам по сути не дает подставлять дочерние подтипы

    • @oguretsagressive
      @oguretsagressive Місяць тому

      @@user-qs4fv5ui5j в mutability дело. Если контейнер изменяемый, то происходит две подстановки - по принципу Лисков и в противоположную сторону. Переменные двух разных типов ссылаются на один контейнер. Поэтому если в переменную с более общим типом (Employee) добавим еще одного Employee, он появится и в переменной с более частным типом (Programmer), кто-то заставит этого Employee написать код - и опаньки.

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t Рік тому +3

    А как же тензорный анализ🤪?..

  • @furrygem5176
    @furrygem5176 Рік тому

    7:55 я думал он скажет "фронтендер не программист"

  • @Max-nr1bv
    @Max-nr1bv Рік тому

    Есть какая литература по теме?

    • @t0digital
      @t0digital  Рік тому +1

      Об этом есть в «Python к вершинам мастерства», Лусиану Рамальо, 2 издание. Мы сейчас читаем ее в Ботаним

  • @user-pw6wo3se1n
    @user-pw6wo3se1n Рік тому

    Ребятки! Меня всегда поражают "сюсюканье" и "щенячий восторг" многих "клепающих" свои комментарии, направленные в адрес автора того или иного видео, вне зависимости от того, на сколько доступно удалось автору объяснить рассматриваемые детали темы, а также, - вне зависимости от того, что полезного осталось в черепушках слушателей лекции, после ее окончания.
    Все это напоминает мне, - не то быль, не то анекдотическую байку о лекции офицера радиотехнически войск противовоздушной обороны в "сержантской учебке" подготавливающей специалистов- операторов РЛС (Радио-локационных станций) из числа солдат-призовников, вот только что принявших воискую присягу.
    Преподаватель, - капитан, вот уже третий день под ряд билсяся как та рыба об лед, пытаясь обяснить вчерашним школьным "троечникам", - что собой представляют: электрический заряд, поле заряда, потенциал, напряжение как разность потенциалов, электродвижущая сила (эдс), постоянный и переменный токи, электрические цепи, синусоидальная форма переменного тока, его частота, амплитуда, период, фазовые сдвиги, активные и реактивные сопротивления, электрические импульсы и их формы, ёмкость и индуктивность, добротность катушек индуктивности, электромагнитные волны - стоячие, бегущие и отраженные, линии с распределенными параметрами, а также, многое-многое другое, что эти "недоросли" должны бы усвоить еще в школе.А вот сейчас должны будут хотя бы немножко соображать, - обслуживая довольно-таки сложную и дорогостоящую технику, - как с ней работать, как проводить профилактические регламентные работы, как настраивать ее, и при этом еще и выявлять незначительные сбои в ее работе..
    Окончив очередную лекцию на тему приемо-передающих антенн, капитан, глядя в абсолютно по-детски чистые, словно у младенцев, глаза слушателей, как и в конце предыдущих занятий произнёс одну и ту же фразу: "Вопросы будут? В ответ последовало гробовое молчание,... Но тут, - о чудо, из задних рядов поднялась чья-то рука - "Разрешите товарищ капитан? Тут абсолютно все понятно, вот только один вопрос, - непонятно, как такая большая амплитуда электрического тока в такой тоненький проводочек помещается?"
    Было ли это или нет.... Издевался ли придуриваясь, этот "салажонок" над капитаном или же действително был полным дебилом, - история умалчивает...
    Но вот мне кажется, судя по комментариям, что большинство так и не поняло, что это за термины такие мудреные: "Инвариантность", "Ковариантность" и "Контравариантность", - для чего они, и "с чем их едят"... А всего лишь из-за нечетко сформулированной автором этого видео, задачи по решению проблем с этими тремя факторами или понятиями, (считайте, как хотите).
    В общем, - все три эти понятия первоначально были приняты в математике. Затем постепенно перекочевали сначала в физику, а затем и в программирование,- как производную отрасль математических вычислений.
    Я бы к примеру, не использовал бы довольно аморфный пример с профессиональной деятельностью сотрудников. На мой взгляд, здесь гораздо сложнее увязывать понятия "сотрудник" с профессиями и специализациями штата работающих.
    Попытка привязать эти определения к листингам отдельных кусков программы, - для слушателей-новичков абсолютно ничего не говорит. А вот, если бы в дискуссию ввязались еще и программисты, - то тогда бы скорее всего, - лекция вообще бы переросла в длительный спор профессионалов о "правильности" и "неправильности" написания "кода" а для новичков это бы превратилось в продолжительное и абсолютно напрасное времяпровождение. Я вообще-то, как ветхий старик, - абсолютно не признаю это свободную "эквилибристику" из уже ранее принятыми понятиями и терминами. Под термином "код" - я понимаю кодироваеие в системах исчисления: двоичной, двоично-десятичной, восьмиричной и остальных, а также, - "кодирование" - как синоним шифрования.
    Все остальное для меня, - это исключительно программирование с листингами программ и блок-схемами определяющими различные алгоритмы, на сколько бы не усложнялись в настоящее время языки программирования... Хотя, я могу в чем-то и ошибаться, однако игра слов, определяющая тот или иной термин, на мой взгляд, только создает путаницу, ибо мне уже довелось в этих новых "сленгах" встречать англоязычные термины, заменившие другие, прежние старые, с абсолютно таким же названиями.
    А сейчас вернусь к теме определения и пояснения трех приведенных выше понятий.
    Я бы, к примеру, в подобной лекции прибег бы к задаче создания небольшой, даже элементарной, поисково-справочной базы данных с использованием библиотеки (в прямом смысле этого слова), состоящей из книг-учебных пособий (в цифровом формате) с классификацией этих книг по авторам, по жанрам в области вычислительной техники, по языкам программирования, по темам, оглавлениям, по отдельным определениям того или иного понятия и т.д. Попытки написания небольших листингов программ с постановкой членораздельной задачи по поиску той или другой темы в указанных книгах могли бы достаточно доходчиво и убедительно объяснить суть видеолекции.
    А так, по примитивным комментариям и не удалось узнать, принес ли указанный видеоурок хоть какую нибудь реальную помощь для обучающихся? Тем более, что в Интернете довольно кратко и доходчиво приведены определения всех трех терминов.

    • @t0digital
      @t0digital  Рік тому +1

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

    • @user-pw6wo3se1n
      @user-pw6wo3se1n Рік тому

      @@t0digital Учту. Но согласитесь, что та Ваша лекция была не совсем удачной.

    • @t0digital
      @t0digital  Рік тому +1

      @@user-pw6wo3se1n нет, не соглашусь

    • @user-pw6wo3se1n
      @user-pw6wo3se1n Рік тому

      @@t0digital Ну что же... Здесь может быть лишь один вывод: Что я гораздо глупее вас.
      А если, к тому же, окажется в действительности, что многие ваши слушатели и зрители реально, а не на словах, поняли вашу трактовку упомянутых терминов и им это поможет в дальнейшем, то мне остается только порадоваться ростками молодых талантов в зарослях нынешнего, почти сплошного невежества.
      Просто я привык гораздо сильнее "разжевавать" подаваемый материал, раз я за него взялся, и пытаться его преподать, как говорится, "на пальцах".
      Я у Вас это больше напоминало лекции Тимофея Хирьянова для студентов МФТИ.

    • @oguretsagressive
      @oguretsagressive Місяць тому

      Осилил оба коммента, понял смысл слова "разжевывать" - усложнить, запутать, добавить воды, канцеляризмов и опечаток (или слов-паразитов, если лекция устная). Чтобы тот, кто изначально не понимал тему, не понял и в конце. Помню в универе самые "разжеванные" материалы как раз этими свойствами и отличались.

  • @guiterenzog2723
    @guiterenzog2723 Рік тому

    Если честно, из-за частого повторения запутался.
    Что я понял:
    - инвариантность - про то, что в списки (сюда же кортежи) конкретного типа можно помещать объекты только этого типа (наследников нельзя)
    - ковариантность - про то, что последовательность конкретного типа может содержать объекты как этого типа, так и его наследников
    - контрвариантность - про то, что можно использовать сущность, предназначенную для конкретного типа, всеми родителями этого типа
    Корректно?

    • @t0digital
      @t0digital  Рік тому +7

      Списки, последовательности и прочее - это конкретные типы, а понятия инвариантности, ковариантности и контравариантности (вероятно в видео я несколько неправильно называл последние два) - абстрактные, то есть не привязаны к конкретным типам вроде листа или последовательности.
      Про что эти понятия. Вот есть класс Parent и есть его подтип Child, то есть Child определён как class Child(Parent). Понятия инвариантности, ковариантности и контравариантности про то, как более сложные типы, построенные из Parent и Child, относятся к этому наследованию Child от Parent. Более сложные типы это, например, последовательности, списки, Callable и пр.
      Ковариантность - более сложные типы наследуются в том же порядке, что и сами классы. Например, Sequence[Child] является подтипом Sequence[Parent]. Туда, где ожидается Sequence[Parent], можно передать Sequence[Child]. В обратную сторону это не работает.
      Инвариантность - более сложные типы никак не относятся к наследованию начальных типов. Нельзя идти ни вверх, ни вниз по иерархии. Например, list[Child] не является подтипом list[Parent], и list[Parent] не является подтипом list[Child]. Туда, где ожидается list[Parent], можно передать только list[Parent], а туда, где ожидается list[Child], можно передать только list[Child].
      Контравариантность - более сложные типы наследуются в обратном порядке. Например, Callable[[Parent], None] является подтипом Callable[[Child], None]. Туда, где ожидается Callable[[Child], None], можно передать Callable[[Parent], None]. В обратную сторону это не работает.

    • @guiterenzog2723
      @guiterenzog2723 Рік тому +1

      @@t0digital отличное объяснение, спасибо!

  • @stanislavserov8622
    @stanislavserov8622 Рік тому

    Привет! Прошу снять что-то русскоязычное по Flet.

    • @t0digital
      @t0digital  Рік тому +1

      про это? flet.dev/

    • @stanislavserov8622
      @stanislavserov8622 Рік тому

      @@t0digital да

    • @stanislavserov8622
      @stanislavserov8622 Рік тому

      @@t0digital там они в документации написали что до конца года планируют сделать нечто expo, как для react, то есть что-то будет прям на мобилке просматриваться во время разработки и тд.

    • @t0digital
      @t0digital  Рік тому

      @@stanislavserov8622 не пользовался такой штукой и от мобильной разработки сейчас далек. Пожалуй, писал бы на Дарте напрямую на флатер, если бы занимался мобильной разработкой

    • @stanislavserov8622
      @stanislavserov8622 Рік тому

      @@t0digital а по django unicorn можете что-то сказать? только сегодня узнал про это.. в рунете мало инфы

  • @stanislavkovalev2783
    @stanislavkovalev2783 Рік тому

    Не петь, а пить )

    • @t0digital
      @t0digital  Рік тому +1

      Возмоооожно:)

  • @KoichiHub
    @KoichiHub Рік тому

    В TypeScript проще работать с типами, чем в Python. Да и книжечка по тоньше - 'Профессиональный TypeScript' от Черного Бори

    • @t0digital
      @t0digital  Рік тому +1

      Да, TS лучше работает с типами

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t Рік тому

    А может ли более узкая специализация класса вызывать перегруженное поведение базового класса? Что-то вроде виртуальных функций или имплементации интерфейсов?..

    • @t0digital
      @t0digital  Рік тому

      Не понял вопрос, к сожалению:)

    • @user-pg8ry1tm3t
      @user-pg8ry1tm3t Рік тому

      @@t0digital просто есть ли какой механизм динамического или иного полиморфизма в питоне?)

    • @megaman13able
      @megaman13able Рік тому

      @@user-pg8ry1tm3t кажется для этого есть оператор super

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

      @@user-pg8ry1tm3t super()

  • @proofit404
    @proofit404 Рік тому +1

    Даже в примерах кода бэкендеры самые обделённые в зарплате WTF

  • @user-rw6vm5bs5g
    @user-rw6vm5bs5g Рік тому

    На руках паныряй!))))) Спалено ;-)

  • @banzaika
    @banzaika Рік тому

    Качество хорошеет, но долго

  • @aleksandrdevelopment3321
    @aleksandrdevelopment3321 Рік тому

    Все очень круто) но откажись уже от пайтона)))

    • @t0digital
      @t0digital  Рік тому +1

      В пользу чего:)?

    • @aleksandrdevelopment3321
      @aleksandrdevelopment3321 Рік тому

      @@t0digital C#/Java а если уж хочешь быть программистом то С++ %)

    • @oguretsagressive
      @oguretsagressive Місяць тому

      @@aleksandrdevelopment3321 и что собираешься писать на C++?

  • @user-kw4kp7eq9m
    @user-kw4kp7eq9m Рік тому

    Я правильно понял, что в Питоне: Sequence - ковариантные, списки - инвариантные, а функции - контрвариантные?

    • @t0digital
      @t0digital  Рік тому +3

      Sequence это неизменяемая структура, поэтому она ковариантна по отношению к типам данных в ней. Списки инвариантны по отношению к типам в структуре. Функции (Callable, там могут быть вызываемые объекты тоже, не только функции) ковариантны по возвращаемому значению (об этом не было в видео, но это так) и контраварианты по аргументам

  • @alexs8582
    @alexs8582 Рік тому

    Почему пайтон, если питон?

    • @t0digital
      @t0digital  Рік тому +1

      Нэт, пайтон) язык назван в честь Монти Пайтон

    • @alexs8582
      @alexs8582 Рік тому

      @@t0digital Понятно, "программисты бывают двух типов - те которые говорят питон и те кто программирует"))

    • @t0digital
      @t0digital  Рік тому

      @@alexs8582 да я не особо обращаю внимание на это:) мое произношение английских слов в любом случае так себе

  • @maybejke
    @maybejke Рік тому

    все видео намеки на этих фронтеендеров, не программеров xDDD

  • @heisenberg6874
    @heisenberg6874 Рік тому +1

    чувак работающий в компании с именем ян😊😊😊

  • @avpmk
    @avpmk Рік тому +1

    Правильно говорить: "ковариантность" и "контравариантность". Вариантность, не вариативность.

  • @zxw
    @zxw Рік тому +1

    Понятнее к сожалению не стало😢

  • @jamuelsexon
    @jamuelsexon Рік тому

    Уснул. Скучно.

    • @t0digital
      @t0digital  Рік тому +1

      Приятных снов!

  • @dogbusiness5201
    @dogbusiness5201 7 місяців тому

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