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