Инвариантность, ковариантность и контравариантность на примере Python
Поговорим о насущном! Инвариантность, ковариантность и контравариантность на примере 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
Браво, Алексей! Так филигранно завуалировать под видео о вариантности мысль что фронтэндеры не программисты - это достойно))) Шутка!
@bukanaka
Жыл бұрын
Ах ты ж бэкендер😂
@KoichiHub
Жыл бұрын
При чем через ошибку, что программисты не фронтендеры
Как Александр люто плюсую за алгоритм начисления зарплаты🤣
Я для простоты понимания зафиксировал себе так: 1. Инвариантность - стоим на месте (для ассоциации - на линии, inline). То есть указываем тип в коде и дальше этого типа никуда не можем двигаться. Представляем иерархию типа и мы на одной из точек, стоим на одной линии. 2. Ковариантность - можем двигаться по типам вниз по иерархии (Кова... - можно ассоциировать с Копать). 3. Контрвариантность - Двигаемся по типам вверх, к родителям типа (ассоциация - Контр, то есть противоположность, то есть как копать, только наоборот 😊). Возможно кому-то будет полезна такая заметка. P.S.: Спасибо за видео! Очень познавательно и доступно!
@chu_ri5470
11 ай бұрын
Дополнение. Инвариантность не обязательно должна быть типовая. То есть, если у тебя есть переменная месяцДляОтпуска, то её значение не может быть отрицательным или 123. Только [0..12] Даже если речь о инте. Иначе лучше её как то переименовать и дополнительно пояснить. Более того попытка все типы обернуть в классы/enum/синтаксис приведёт вас к более страшным последствиям. Особенно в Питоне из-за не самой удобной работы с интерфейсами и наследованием.
Какая прелесть! Очень интересно, спасибо большое!
Круто, все четко без воды и с примерами. На пальцах показал за что лайк и питонячее спасибо.
Прям актуально, типизация страшная сила ... Спасибо
Как будто-бы изменилась подача и, однозначно, в лучшую сторону! Лайк однозначно
@t0digital
Жыл бұрын
Спасибооо!
Спасибо за видео!
Спасибо за видос. Сидел читал википедию и какие-то статьи и была каша в голове была. После видоса сразу все встало на места.
Очень полезное видео. Вообще, я знал про все эти делегаты, контейнеры, но не представлял, что в питоне, таком необязательном для типизации языке, оно используется, и столкнулся с этим сразу на Generic'ах в TypeVar. Было очень послушать эту тему именно на примере питона
контравариантность - это когда программист делает задачу, которую должен делать сотрудник. Как же это знакомо)))
@oguretsagressive
Ай бұрын
Это контрпродуктивность 😁
ТОП!
Спасибо за такую работу. Можешь пожалуйста сделать обучающую видео как правильно реализовать идею. Например у меня часто бывает такое что теоретически правильно решил задачу, придумал правильный алгоритм но потом когда хочу писать код сижу перед компьютером часами и не знаю что делать.
Привет, сидел на работе. Все было неплохо. И тут попалось это видео, и меня на середине вырубило. Очнулся через пару часов
@t0digital
15 күн бұрын
Что может быть лучше здорового послеобеденного сна!
на предыдущей работе в тайп хинтах ковариативность использовали в модуле который конфиги грузил разных классов в зависимости от переменной окружения ENVIRONMENT))) ну тип был базовый класс и куча дочек local, dev, testing, test, stage prod)))
Ничегошеньки не понял, но очень интересно)) Отложу видео на потом, сейчас не хватает знаний
Кайф
Этак, неявное преобразование типов для ссылок на иммутабельные структуры не работает… а если будет неконстант, также инвариант по ссылкам сохранится?..
👏
Если в примере с инвариантностью я сделаю programmers_list = frontenders_list.copy(), то при добавлении элементов в любой из списков результат операции не отразится на втором списке. Очевидно, что frontenders_list и frontenders_list.copy() имеют один и тот же тип.
Браво. Топ канал.
Good evening Ozzy
Алексей, как попасть к вам на курс?когда он стартует?
@t0digital
Жыл бұрын
Курс ещё не запущен. Подпишитесь на телеграм, там будет вся информация t.me/t0digital
@sad0FFsky
Жыл бұрын
@@t0digital а примерные сроки запуска известны?
Типизация непростая тема. Никак не врублюсь почему типы раскиданы по модулям разным, когда есть вроде специальный typing. Нужен тебе какой, то по всему питону ищи... Тему видоса вообще понял только к резьюме 15:50 😂
Пример для инвариантности заставил удивиться. Пальцы всегда сами бьют "from typing import List"... :)
Если очень простыми словами: Инвариантность - можно присвоить именно тот тип, который указан Ковариантность - тип и его потомков Контрвариантность - тип его и предков
А как же тензорный анализ🤪?..
Возможно я не въехал, но кажется, что пример про контравариативность некорректный т.к. аннотация аргументов функция работает ковариативно т.к. task_for_employee принимает Employee и его наследников.
@user-vc2nf9cv8b
9 ай бұрын
тоже думаю об этом и ломаю голову........
@oguretsagressive
Ай бұрын
Все-таки корректный, просто здесь только аргумент "task" контравариантный (подходят функции со всем что выше по иерархии). Аргументы для "task_for_*" ковариантные ("Programmer" и ниже по иерархии).
Если честно, из-за частого повторения запутался. Что я понял: - инвариантность - про то, что в списки (сюда же кортежи) конкретного типа можно помещать объекты только этого типа (наследников нельзя) - ковариантность - про то, что последовательность конкретного типа может содержать объекты как этого типа, так и его наследников - контрвариантность - про то, что можно использовать сущность, предназначенную для конкретного типа, всеми родителями этого типа Корректно?
@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
Жыл бұрын
@@t0digital отличное объяснение, спасибо!
Разве инвариантность и контрвариантность не противоречат принципу подстановки Лисков?
@t0digital
7 ай бұрын
Неа. Если интересна тема, задайте вопрос конкретнее
@user-qs4fv5ui5j
7 ай бұрын
@@t0digital ну вот такое видел: Этот принцип говорит нам о том, что если класс Sub является подтипом класса Sup, тогда в программе объекты типа Sup должны легко заменяться объектами типа Sub без необходимости изменения кода. А Инвариантность нам по сути не дает подставлять дочерние подтипы
@oguretsagressive
Ай бұрын
@@user-qs4fv5ui5j в mutability дело. Если контейнер изменяемый, то происходит две подстановки - по принципу Лисков и в противоположную сторону. Переменные двух разных типов ссылаются на один контейнер. Поэтому если в переменную с более общим типом (Employee) добавим еще одного Employee, он появится и в переменной с более частным типом (Programmer), кто-то заставит этого Employee написать код - и опаньки.
Не петь, а пить )
@t0digital
Жыл бұрын
Возмоооожно:)
7:55 я думал он скажет "фронтендер не программист"
Есть какая литература по теме?
@t0digital
Жыл бұрын
Об этом есть в «Python к вершинам мастерства», Лусиану Рамальо, 2 издание. Мы сейчас читаем ее в Ботаним
В TypeScript проще работать с типами, чем в Python. Да и книжечка по тоньше - 'Профессиональный TypeScript' от Черного Бори
@t0digital
Жыл бұрын
Да, TS лучше работает с типами
Привет! Прошу снять что-то русскоязычное по Flet.
@t0digital
Жыл бұрын
про это? flet.dev/
@stanislavserov8622
Жыл бұрын
@@t0digital да
@stanislavserov8622
Жыл бұрын
@@t0digital там они в документации написали что до конца года планируют сделать нечто expo, как для react, то есть что-то будет прям на мобилке просматриваться во время разработки и тд.
@t0digital
Жыл бұрын
@@stanislavserov8622 не пользовался такой штукой и от мобильной разработки сейчас далек. Пожалуй, писал бы на Дарте напрямую на флатер, если бы занимался мобильной разработкой
@stanislavserov8622
Жыл бұрын
@@t0digital а по django unicorn можете что-то сказать? только сегодня узнал про это.. в рунете мало инфы
Ребятки! Меня всегда поражают "сюсюканье" и "щенячий восторг" многих "клепающих" свои комментарии, направленные в адрес автора того или иного видео, вне зависимости от того, на сколько доступно удалось автору объяснить рассматриваемые детали темы, а также, - вне зависимости от того, что полезного осталось в черепушках слушателей лекции, после ее окончания. Все это напоминает мне, - не то быль, не то анекдотическую байку о лекции офицера радиотехнически войск противовоздушной обороны в "сержантской учебке" подготавливающей специалистов- операторов РЛС (Радио-локационных станций) из числа солдат-призовников, вот только что принявших воискую присягу. Преподаватель, - капитан, вот уже третий день под ряд билсяся как та рыба об лед, пытаясь обяснить вчерашним школьным "троечникам", - что собой представляют: электрический заряд, поле заряда, потенциал, напряжение как разность потенциалов, электродвижущая сила (эдс), постоянный и переменный токи, электрические цепи, синусоидальная форма переменного тока, его частота, амплитуда, период, фазовые сдвиги, активные и реактивные сопротивления, электрические импульсы и их формы, ёмкость и индуктивность, добротность катушек индуктивности, электромагнитные волны - стоячие, бегущие и отраженные, линии с распределенными параметрами, а также, многое-многое другое, что эти "недоросли" должны бы усвоить еще в школе.А вот сейчас должны будут хотя бы немножко соображать, - обслуживая довольно-таки сложную и дорогостоящую технику, - как с ней работать, как проводить профилактические регламентные работы, как настраивать ее, и при этом еще и выявлять незначительные сбои в ее работе.. Окончив очередную лекцию на тему приемо-передающих антенн, капитан, глядя в абсолютно по-детски чистые, словно у младенцев, глаза слушателей, как и в конце предыдущих занятий произнёс одну и ту же фразу: "Вопросы будут? В ответ последовало гробовое молчание,... Но тут, - о чудо, из задних рядов поднялась чья-то рука - "Разрешите товарищ капитан? Тут абсолютно все понятно, вот только один вопрос, - непонятно, как такая большая амплитуда электрического тока в такой тоненький проводочек помещается?" Было ли это или нет.... Издевался ли придуриваясь, этот "салажонок" над капитаном или же действително был полным дебилом, - история умалчивает... Но вот мне кажется, судя по комментариям, что большинство так и не поняло, что это за термины такие мудреные: "Инвариантность", "Ковариантность" и "Контравариантность", - для чего они, и "с чем их едят"... А всего лишь из-за нечетко сформулированной автором этого видео, задачи по решению проблем с этими тремя факторами или понятиями, (считайте, как хотите). В общем, - все три эти понятия первоначально были приняты в математике. Затем постепенно перекочевали сначала в физику, а затем и в программирование,- как производную отрасль математических вычислений. Я бы к примеру, не использовал бы довольно аморфный пример с профессиональной деятельностью сотрудников. На мой взгляд, здесь гораздо сложнее увязывать понятия "сотрудник" с профессиями и специализациями штата работающих. Попытка привязать эти определения к листингам отдельных кусков программы, - для слушателей-новичков абсолютно ничего не говорит. А вот, если бы в дискуссию ввязались еще и программисты, - то тогда бы скорее всего, - лекция вообще бы переросла в длительный спор профессионалов о "правильности" и "неправильности" написания "кода" а для новичков это бы превратилось в продолжительное и абсолютно напрасное времяпровождение. Я вообще-то, как ветхий старик, - абсолютно не признаю это свободную "эквилибристику" из уже ранее принятыми понятиями и терминами. Под термином "код" - я понимаю кодироваеие в системах исчисления: двоичной, двоично-десятичной, восьмиричной и остальных, а также, - "кодирование" - как синоним шифрования. Все остальное для меня, - это исключительно программирование с листингами программ и блок-схемами определяющими различные алгоритмы, на сколько бы не усложнялись в настоящее время языки программирования... Хотя, я могу в чем-то и ошибаться, однако игра слов, определяющая тот или иной термин, на мой взгляд, только создает путаницу, ибо мне уже довелось в этих новых "сленгах" встречать англоязычные термины, заменившие другие, прежние старые, с абсолютно таким же названиями. А сейчас вернусь к теме определения и пояснения трех приведенных выше понятий. Я бы, к примеру, в подобной лекции прибег бы к задаче создания небольшой, даже элементарной, поисково-справочной базы данных с использованием библиотеки (в прямом смысле этого слова), состоящей из книг-учебных пособий (в цифровом формате) с классификацией этих книг по авторам, по жанрам в области вычислительной техники, по языкам программирования, по темам, оглавлениям, по отдельным определениям того или иного понятия и т.д. Попытки написания небольших листингов программ с постановкой членораздельной задачи по поиску той или другой темы в указанных книгах могли бы достаточно доходчиво и убедительно объяснить суть видеолекции. А так, по примитивным комментариям и не удалось узнать, принес ли указанный видеоурок хоть какую нибудь реальную помощь для обучающихся? Тем более, что в Интернете довольно кратко и доходчиво приведены определения всех трех терминов.
@t0digital
Жыл бұрын
Спасибо за комментарий! Рекомендую разбивать текст на небольшие осмысленные абзацы - вероятность того, что кто-то их прочтёт, будет значительно выше.
@user-pw6wo3se1n
Жыл бұрын
@@t0digital Учту. Но согласитесь, что та Ваша лекция была не совсем удачной.
@t0digital
Жыл бұрын
@@user-pw6wo3se1n нет, не соглашусь
@user-pw6wo3se1n
Жыл бұрын
@@t0digital Ну что же... Здесь может быть лишь один вывод: Что я гораздо глупее вас. А если, к тому же, окажется в действительности, что многие ваши слушатели и зрители реально, а не на словах, поняли вашу трактовку упомянутых терминов и им это поможет в дальнейшем, то мне остается только порадоваться ростками молодых талантов в зарослях нынешнего, почти сплошного невежества. Просто я привык гораздо сильнее "разжевавать" подаваемый материал, раз я за него взялся, и пытаться его преподать, как говорится, "на пальцах". Я у Вас это больше напоминало лекции Тимофея Хирьянова для студентов МФТИ.
@oguretsagressive
Ай бұрын
Осилил оба коммента, понял смысл слова "разжевывать" - усложнить, запутать, добавить воды, канцеляризмов и опечаток (или слов-паразитов, если лекция устная). Чтобы тот, кто изначально не понимал тему, не понял и в конце. Помню в универе самые "разжеванные" материалы как раз этими свойствами и отличались.
Даже в примерах кода бэкендеры самые обделённые в зарплате WTF
На руках паныряй!))))) Спалено ;-)
А может ли более узкая специализация класса вызывать перегруженное поведение базового класса? Что-то вроде виртуальных функций или имплементации интерфейсов?..
@t0digital
Жыл бұрын
Не понял вопрос, к сожалению:)
@user-pg8ry1tm3t
Жыл бұрын
@@t0digital просто есть ли какой механизм динамического или иного полиморфизма в питоне?)
@megaman13able
Жыл бұрын
@@user-pg8ry1tm3t кажется для этого есть оператор super
@mark_parker
4 ай бұрын
@@user-pg8ry1tm3t super()
все видео намеки на этих фронтеендеров, не программеров xDDD
Качество хорошеет, но долго
Все очень круто) но откажись уже от пайтона)))
@t0digital
Жыл бұрын
В пользу чего:)?
@aleksandrdevelopment3321
Жыл бұрын
@@t0digital C#/Java а если уж хочешь быть программистом то С++ %)
@oguretsagressive
Ай бұрын
@@aleksandrdevelopment3321 и что собираешься писать на C++?
Почему пайтон, если питон?
@t0digital
Жыл бұрын
Нэт, пайтон) язык назван в честь Монти Пайтон
@alexs8582
Жыл бұрын
@@t0digital Понятно, "программисты бывают двух типов - те которые говорят питон и те кто программирует"))
@t0digital
Жыл бұрын
@@alexs8582 да я не особо обращаю внимание на это:) мое произношение английских слов в любом случае так себе
чувак работающий в компании с именем ян😊😊😊
@t0digital
Жыл бұрын
Бедолага😂
Я правильно понял, что в Питоне: Sequence - ковариантные, списки - инвариантные, а функции - контрвариантные?
@t0digital
Жыл бұрын
Sequence это неизменяемая структура, поэтому она ковариантна по отношению к типам данных в ней. Списки инвариантны по отношению к типам в структуре. Функции (Callable, там могут быть вызываемые объекты тоже, не только функции) ковариантны по возвращаемому значению (об этом не было в видео, но это так) и контраварианты по аргументам
Правильно говорить: "ковариантность" и "контравариантность". Вариантность, не вариативность.
@t0digital
Жыл бұрын
Да
Понятнее к сожалению не стало😢
Уснул. Скучно.
@t0digital
Жыл бұрын
Приятных снов!
Спасибо за видео!