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

  Переглядів 22,289

Диджитализируй!

Диджитализируй!

День тому

Поговорим о насущном! Инвариантность, ковариантность и контравариантность на примере 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...

КОМЕНТАРІ: 93
@user-jr3iv3ny9c
@user-jr3iv3ny9c Рік тому
Браво, Алексей! Так филигранно завуалировать под видео о вариантности мысль что фронтэндеры не программисты - это достойно))) Шутка!
@bukanaka
@bukanaka Рік тому
Ах ты ж бэкендер😂
@KoichiHub
@KoichiHub Рік тому
При чем через ошибку, что программисты не фронтендеры
@alexdzehil7194
@alexdzehil7194 Рік тому
Как Александр люто плюсую за алгоритм начисления зарплаты🤣
@filippov_es
@filippov_es Рік тому
Какая прелесть! Очень интересно, спасибо большое!
@OlViktorovich
@OlViktorovich Рік тому
Прям актуально, типизация страшная сила ... Спасибо
@user-pg8ry1tm3t
@user-pg8ry1tm3t Рік тому
Спасибо за видео!
@valk9819
@valk9819 11 місяців тому
Круто, все четко без воды и с примерами. На пальцах показал за что лайк и питонячее спасибо.
@d1z3ro
@d1z3ro Рік тому
Как будто-бы изменилась подача и, однозначно, в лучшую сторону! Лайк однозначно
@t0digital
@t0digital Рік тому
Спасибооо!
@alittlemoron4068
@alittlemoron4068 Рік тому
Очень полезное видео. Вообще, я знал про все эти делегаты, контейнеры, но не представлял, что в питоне, таком необязательном для типизации языке, оно используется, и столкнулся с этим сразу на Generic'ах в TypeVar. Было очень послушать эту тему именно на примере питона
@Keriokutori
@Keriokutori Рік тому
контравариантность - это когда программист делает задачу, которую должен делать сотрудник. Как же это знакомо)))
@oguretsagressive
@oguretsagressive 12 днів тому
Это контрпродуктивность 😁
@lukasmog777
@lukasmog777 3 місяці тому
Спасибо за видос. Сидел читал википедию и какие-то статьи и была каша в голове была. После видоса сразу все встало на места.
@samvelsafaryan4698
@samvelsafaryan4698 Рік тому
Спасибо за такую работу. Можешь пожалуйста сделать обучающую видео как правильно реализовать идею. Например у меня часто бывает такое что теоретически правильно решил задачу, придумал правильный алгоритм но потом когда хочу писать код сижу перед компьютером часами и не знаю что делать.
@P7Vagrant
@P7Vagrant Рік тому
Я для простоты понимания зафиксировал себе так: 1. Инвариантность - стоим на месте (для ассоциации - на линии, inline). То есть указываем тип в коде и дальше этого типа никуда не можем двигаться. Представляем иерархию типа и мы на одной из точек, стоим на одной линии. 2. Ковариантность - можем двигаться по типам вниз по иерархии (Кова... - можно ассоциировать с Копать). 3. Контрвариантность - Двигаемся по типам вверх, к родителям типа (ассоциация - Контр, то есть противоположность, то есть как копать, только наоборот 😊). Возможно кому-то будет полезна такая заметка. P.S.: Спасибо за видео! Очень познавательно и доступно!
@chu_ri5470
@chu_ri5470 11 місяців тому
Дополнение. Инвариантность не обязательно должна быть типовая. То есть, если у тебя есть переменная месяцДляОтпуска, то её значение не может быть отрицательным или 123. Только [0..12] Даже если речь о инте. Иначе лучше её как то переименовать и дополнительно пояснить. Более того попытка все типы обернуть в классы/enum/синтаксис приведёт вас к более страшным последствиям. Особенно в Питоне из-за не самой удобной работы с интерфейсами и наследованием.
@moowmotors
@moowmotors Рік тому
ТОП!
@MadMike93
@MadMike93 Рік тому
на предыдущей работе в тайп хинтах ковариативность использовали в модуле который конфиги грузил разных классов в зависимости от переменной окружения ENVIRONMENT))) ну тип был базовый класс и куча дочек local, dev, testing, test, stage prod)))
@Maniakalochka
@Maniakalochka Рік тому
Ничегошеньки не понял, но очень интересно)) Отложу видео на потом, сейчас не хватает знаний
@user-pg8ry1tm3t
@user-pg8ry1tm3t Рік тому
Этак, неявное преобразование типов для ссылок на иммутабельные структуры не работает… а если будет неконстант, также инвариант по ссылкам сохранится?..
@jamjam3337
@jamjam3337 Рік тому
👏
@uicodeuz
@uicodeuz Рік тому
Кайф
@TheDeatgod
@TheDeatgod Рік тому
Если в примере с инвариантностью я сделаю programmers_list = frontenders_list.copy(), то при добавлении элементов в любой из списков результат операции не отразится на втором списке. Очевидно, что frontenders_list и frontenders_list.copy() имеют один и тот же тип.
@user-cw3ui3je5g
@user-cw3ui3je5g Рік тому
Браво. Топ канал.
@sad0FFsky
@sad0FFsky Рік тому
Алексей, как попасть к вам на курс?когда он стартует?
@t0digital
@t0digital Рік тому
Курс ещё не запущен. Подпишитесь на телеграм, там будет вся информация t.me/t0digital
@sad0FFsky
@sad0FFsky Рік тому
@@t0digital а примерные сроки запуска известны?
@DES2048
@DES2048 8 місяців тому
Если очень простыми словами: Инвариантность - можно присвоить именно тот тип, который указан Ковариантность - тип и его потомков Контрвариантность - тип его и предков
@VGCor
@VGCor Рік тому
Типизация непростая тема. Никак не врублюсь почему типы раскиданы по модулям разным, когда есть вроде специальный typing. Нужен тебе какой, то по всему питону ищи... Тему видоса вообще понял только к резьюме 15:50 😂
@JillOverlord
@JillOverlord Рік тому
Пример для инвариантности заставил удивиться. Пальцы всегда сами бьют "from typing import List"... :)
@MrNagios
@MrNagios Рік тому
Good evening Ozzy
@user-pg8ry1tm3t
@user-pg8ry1tm3t Рік тому
А как же тензорный анализ🤪?..
@KoichiHub
@KoichiHub Рік тому
В TypeScript проще работать с типами, чем в Python. Да и книжечка по тоньше - 'Профессиональный TypeScript' от Черного Бори
@t0digital
@t0digital Рік тому
Да, TS лучше работает с типами
@Max-nr1bv
@Max-nr1bv Рік тому
Есть какая литература по теме?
@t0digital
@t0digital Рік тому
Об этом есть в «Python к вершинам мастерства», Лусиану Рамальо, 2 издание. Мы сейчас читаем ее в Ботаним
@furrygem5176
@furrygem5176 Рік тому
7:55 я думал он скажет "фронтендер не программист"
@stanislavserov8622
@stanislavserov8622 Рік тому
Привет! Прошу снять что-то русскоязычное по Flet.
@t0digital
@t0digital Рік тому
про это? flet.dev/
@stanislavserov8622
@stanislavserov8622 Рік тому
@@t0digital да
@stanislavserov8622
@stanislavserov8622 Рік тому
@@t0digital там они в документации написали что до конца года планируют сделать нечто expo, как для react, то есть что-то будет прям на мобилке просматриваться во время разработки и тд.
@t0digital
@t0digital Рік тому
@@stanislavserov8622 не пользовался такой штукой и от мобильной разработки сейчас далек. Пожалуй, писал бы на Дарте напрямую на флатер, если бы занимался мобильной разработкой
@stanislavserov8622
@stanislavserov8622 Рік тому
@@t0digital а по django unicorn можете что-то сказать? только сегодня узнал про это.. в рунете мало инфы
@guiterenzog2723
@guiterenzog2723 Рік тому
Если честно, из-за частого повторения запутался. Что я понял: - инвариантность - про то, что в списки (сюда же кортежи) конкретного типа можно помещать объекты только этого типа (наследников нельзя) - ковариантность - про то, что последовательность конкретного типа может содержать объекты как этого типа, так и его наследников - контрвариантность - про то, что можно использовать сущность, предназначенную для конкретного типа, всеми родителями этого типа Корректно?
@t0digital
@t0digital Рік тому
Списки, последовательности и прочее - это конкретные типы, а понятия инвариантности, ковариантности и контравариантности (вероятно в видео я несколько неправильно называл последние два) - абстрактные, то есть не привязаны к конкретным типам вроде листа или последовательности. Про что эти понятия. Вот есть класс 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 Рік тому
@@t0digital отличное объяснение, спасибо!
@user-qs4fv5ui5j
@user-qs4fv5ui5j 6 місяців тому
Разве инвариантность и контрвариантность не противоречат принципу подстановки Лисков?
@t0digital
@t0digital 6 місяців тому
Неа. Если интересна тема, задайте вопрос конкретнее
@user-qs4fv5ui5j
@user-qs4fv5ui5j 6 місяців тому
@@t0digital ну вот такое видел: Этот принцип говорит нам о том, что если класс Sub является подтипом класса Sup, тогда в программе объекты типа Sup должны легко заменяться объектами типа Sub без необходимости изменения кода. А Инвариантность нам по сути не дает подставлять дочерние подтипы
@oguretsagressive
@oguretsagressive 12 днів тому
@@user-qs4fv5ui5j в mutability дело. Если контейнер изменяемый, то происходит две подстановки - по принципу Лисков и в противоположную сторону. Переменные двух разных типов ссылаются на один контейнер. Поэтому если в переменную с более общим типом (Employee) добавим еще одного Employee, он появится и в переменной с более частным типом (Programmer), кто-то заставит этого Employee написать код - и опаньки.
@Skeap11
@Skeap11 11 місяців тому
Возможно я не въехал, но кажется, что пример про контравариативность некорректный т.к. аннотация аргументов функция работает ковариативно т.к. task_for_employee принимает Employee и его наследников.
@user-vc2nf9cv8b
@user-vc2nf9cv8b 8 місяців тому
тоже думаю об этом и ломаю голову........
@oguretsagressive
@oguretsagressive 12 днів тому
Все-таки корректный, просто здесь только аргумент "task" контравариантный (подходят функции со всем что выше по иерархии). Аргументы для "task_for_*" ковариантные ("Programmer" и ниже по иерархии).
@user-pw6wo3se1n
@user-pw6wo3se1n 11 місяців тому
Ребятки! Меня всегда поражают "сюсюканье" и "щенячий восторг" многих "клепающих" свои комментарии, направленные в адрес автора того или иного видео, вне зависимости от того, на сколько доступно удалось автору объяснить рассматриваемые детали темы, а также, - вне зависимости от того, что полезного осталось в черепушках слушателей лекции, после ее окончания. Все это напоминает мне, - не то быль, не то анекдотическую байку о лекции офицера радиотехнически войск противовоздушной обороны в "сержантской учебке" подготавливающей специалистов- операторов РЛС (Радио-локационных станций) из числа солдат-призовников, вот только что принявших воискую присягу. Преподаватель, - капитан, вот уже третий день под ряд билсяся как та рыба об лед, пытаясь обяснить вчерашним школьным "троечникам", - что собой представляют: электрический заряд, поле заряда, потенциал, напряжение как разность потенциалов, электродвижущая сила (эдс), постоянный и переменный токи, электрические цепи, синусоидальная форма переменного тока, его частота, амплитуда, период, фазовые сдвиги, активные и реактивные сопротивления, электрические импульсы и их формы, ёмкость и индуктивность, добротность катушек индуктивности, электромагнитные волны - стоячие, бегущие и отраженные, линии с распределенными параметрами, а также, многое-многое другое, что эти "недоросли" должны бы усвоить еще в школе.А вот сейчас должны будут хотя бы немножко соображать, - обслуживая довольно-таки сложную и дорогостоящую технику, - как с ней работать, как проводить профилактические регламентные работы, как настраивать ее, и при этом еще и выявлять незначительные сбои в ее работе.. Окончив очередную лекцию на тему приемо-передающих антенн, капитан, глядя в абсолютно по-детски чистые, словно у младенцев, глаза слушателей, как и в конце предыдущих занятий произнёс одну и ту же фразу: "Вопросы будут? В ответ последовало гробовое молчание,... Но тут, - о чудо, из задних рядов поднялась чья-то рука - "Разрешите товарищ капитан? Тут абсолютно все понятно, вот только один вопрос, - непонятно, как такая большая амплитуда электрического тока в такой тоненький проводочек помещается?" Было ли это или нет.... Издевался ли придуриваясь, этот "салажонок" над капитаном или же действително был полным дебилом, - история умалчивает... Но вот мне кажется, судя по комментариям, что большинство так и не поняло, что это за термины такие мудреные: "Инвариантность", "Ковариантность" и "Контравариантность", - для чего они, и "с чем их едят"... А всего лишь из-за нечетко сформулированной автором этого видео, задачи по решению проблем с этими тремя факторами или понятиями, (считайте, как хотите). В общем, - все три эти понятия первоначально были приняты в математике. Затем постепенно перекочевали сначала в физику, а затем и в программирование,- как производную отрасль математических вычислений. Я бы к примеру, не использовал бы довольно аморфный пример с профессиональной деятельностью сотрудников. На мой взгляд, здесь гораздо сложнее увязывать понятия "сотрудник" с профессиями и специализациями штата работающих. Попытка привязать эти определения к листингам отдельных кусков программы, - для слушателей-новичков абсолютно ничего не говорит. А вот, если бы в дискуссию ввязались еще и программисты, - то тогда бы скорее всего, - лекция вообще бы переросла в длительный спор профессионалов о "правильности" и "неправильности" написания "кода" а для новичков это бы превратилось в продолжительное и абсолютно напрасное времяпровождение. Я вообще-то, как ветхий старик, - абсолютно не признаю это свободную "эквилибристику" из уже ранее принятыми понятиями и терминами. Под термином "код" - я понимаю кодироваеие в системах исчисления: двоичной, двоично-десятичной, восьмиричной и остальных, а также, - "кодирование" - как синоним шифрования. Все остальное для меня, - это исключительно программирование с листингами программ и блок-схемами определяющими различные алгоритмы, на сколько бы не усложнялись в настоящее время языки программирования... Хотя, я могу в чем-то и ошибаться, однако игра слов, определяющая тот или иной термин, на мой взгляд, только создает путаницу, ибо мне уже довелось в этих новых "сленгах" встречать англоязычные термины, заменившие другие, прежние старые, с абсолютно таким же названиями. А сейчас вернусь к теме определения и пояснения трех приведенных выше понятий. Я бы, к примеру, в подобной лекции прибег бы к задаче создания небольшой, даже элементарной, поисково-справочной базы данных с использованием библиотеки (в прямом смысле этого слова), состоящей из книг-учебных пособий (в цифровом формате) с классификацией этих книг по авторам, по жанрам в области вычислительной техники, по языкам программирования, по темам, оглавлениям, по отдельным определениям того или иного понятия и т.д. Попытки написания небольших листингов программ с постановкой членораздельной задачи по поиску той или другой темы в указанных книгах могли бы достаточно доходчиво и убедительно объяснить суть видеолекции. А так, по примитивным комментариям и не удалось узнать, принес ли указанный видеоурок хоть какую нибудь реальную помощь для обучающихся? Тем более, что в Интернете довольно кратко и доходчиво приведены определения всех трех терминов.
@t0digital
@t0digital 11 місяців тому
Спасибо за комментарий! Рекомендую разбивать текст на небольшие осмысленные абзацы - вероятность того, что кто-то их прочтёт, будет значительно выше.
@user-pw6wo3se1n
@user-pw6wo3se1n 11 місяців тому
@@t0digital Учту. Но согласитесь, что та Ваша лекция была не совсем удачной.
@t0digital
@t0digital 11 місяців тому
@@user-pw6wo3se1n нет, не соглашусь
@user-pw6wo3se1n
@user-pw6wo3se1n 11 місяців тому
@@t0digital Ну что же... Здесь может быть лишь один вывод: Что я гораздо глупее вас. А если, к тому же, окажется в действительности, что многие ваши слушатели и зрители реально, а не на словах, поняли вашу трактовку упомянутых терминов и им это поможет в дальнейшем, то мне остается только порадоваться ростками молодых талантов в зарослях нынешнего, почти сплошного невежества. Просто я привык гораздо сильнее "разжевавать" подаваемый материал, раз я за него взялся, и пытаться его преподать, как говорится, "на пальцах". Я у Вас это больше напоминало лекции Тимофея Хирьянова для студентов МФТИ.
@oguretsagressive
@oguretsagressive 12 днів тому
Осилил оба коммента, понял смысл слова "разжевывать" - усложнить, запутать, добавить воды, канцеляризмов и опечаток (или слов-паразитов, если лекция устная). Чтобы тот, кто изначально не понимал тему, не понял и в конце. Помню в универе самые "разжеванные" материалы как раз этими свойствами и отличались.
@user-pg8ry1tm3t
@user-pg8ry1tm3t Рік тому
А может ли более узкая специализация класса вызывать перегруженное поведение базового класса? Что-то вроде виртуальных функций или имплементации интерфейсов?..
@t0digital
@t0digital Рік тому
Не понял вопрос, к сожалению:)
@user-pg8ry1tm3t
@user-pg8ry1tm3t Рік тому
@@t0digital просто есть ли какой механизм динамического или иного полиморфизма в питоне?)
@megaman13able
@megaman13able Рік тому
@@user-pg8ry1tm3t кажется для этого есть оператор super
@mark_parker
@mark_parker 3 місяці тому
@@user-pg8ry1tm3t super()
@banzaika
@banzaika Рік тому
Качество хорошеет, но долго
@alexs8582
@alexs8582 Рік тому
Почему пайтон, если питон?
@t0digital
@t0digital Рік тому
Нэт, пайтон) язык назван в честь Монти Пайтон
@alexs8582
@alexs8582 Рік тому
@@t0digital Понятно, "программисты бывают двух типов - те которые говорят питон и те кто программирует"))
@t0digital
@t0digital Рік тому
@@alexs8582 да я не особо обращаю внимание на это:) мое произношение английских слов в любом случае так себе
@user-rw6vm5bs5g
@user-rw6vm5bs5g Рік тому
На руках паныряй!))))) Спалено ;-)
@stanislavkovalev2783
@stanislavkovalev2783 Рік тому
Не петь, а пить )
@t0digital
@t0digital Рік тому
Возмоооожно:)
@proofit404
@proofit404 Рік тому
Даже в примерах кода бэкендеры самые обделённые в зарплате WTF
@aleksandrdevelopment3321
@aleksandrdevelopment3321 11 місяців тому
Все очень круто) но откажись уже от пайтона)))
@t0digital
@t0digital 11 місяців тому
В пользу чего:)?
@aleksandrdevelopment3321
@aleksandrdevelopment3321 11 місяців тому
@@t0digital C#/Java а если уж хочешь быть программистом то С++ %)
@oguretsagressive
@oguretsagressive 12 днів тому
@@aleksandrdevelopment3321 и что собираешься писать на C++?
@user-kw4kp7eq9m
@user-kw4kp7eq9m Рік тому
Я правильно понял, что в Питоне: Sequence - ковариантные, списки - инвариантные, а функции - контрвариантные?
@t0digital
@t0digital Рік тому
Sequence это неизменяемая структура, поэтому она ковариантна по отношению к типам данных в ней. Списки инвариантны по отношению к типам в структуре. Функции (Callable, там могут быть вызываемые объекты тоже, не только функции) ковариантны по возвращаемому значению (об этом не было в видео, но это так) и контраварианты по аргументам
@maybejke
@maybejke Рік тому
все видео намеки на этих фронтеендеров, не программеров xDDD
@heisenberg6874
@heisenberg6874 Рік тому
чувак работающий в компании с именем ян😊😊😊
@t0digital
@t0digital Рік тому
Бедолага😂
@avpmk
@avpmk Рік тому
Правильно говорить: "ковариантность" и "контравариантность". Вариантность, не вариативность.
@t0digital
@t0digital Рік тому
Да
@zxw
@zxw Рік тому
Понятнее к сожалению не стало😢
@jamuelsexon
@jamuelsexon Рік тому
Уснул. Скучно.
@t0digital
@t0digital Рік тому
Приятных снов!
@dogbusiness5201
@dogbusiness5201 6 місяців тому
Спасибо за видео!
Мы играли всей семьей
00:27
Даша Боровик
Переглядів 1,2 млн
ЧТО ДЕЛАТЬ, ЕСЛИ НЕ ХВАТАЕТ ДЕНЕГ НА ВОССТАНОВЛЕНИЕ ТАЧКИ?
47:52
Разбираем основы Kafka и RabbitMQ
26:54
Digital train | Alex Babin
Переглядів 8 тис.
Инвариант в программировании
18:54
Python: NewType против TypeAlias. Декомпозиция типов
11:13
Диджитализируй!
Переглядів 19 тис.
C#. Covariance and Contravariance in generic interfaces.
6:35
ExtremeCode
Переглядів 79 тис.
Именование переменных, классов и методов в коде
25:40
Диджитализируй!
Переглядів 43 тис.
Corel Linux - The (Word)Perfect Operating System
25:40
Michael MJD
Переглядів 73 тис.
Мы играли всей семьей
00:27
Даша Боровик
Переглядів 1,2 млн