и который проконтролирует, что поступающие в нее параметры соответствуют тайпхинтам?
это невозможно сделать в рантайме
def foo(a: list[int]): a.append(1) a: list[str]=[] foo(a)
И чего тут невозможного? Пустой список не противоречит указанному ограничению, отклонение от ограничения встретилось 0 раз
а теперь так: def foo(a: list[int]): a.append(1) a: list[str]=[] foo(a) for x in a: print(a.lower())
пустой список противоречит указанному ограничению. list[str] означает что туда можно добавлять только строки, а функция туда добавила число
Тоже нет противоречия, т.к. мы чекаем декоратором только переменные на входе, а что с ними дальше делает функция - не чекаем, функция может нарушать контракт
шта
так пустой список и есть переменная
Почему? Ограничение можно описать как "каждый элемент списка не должен быть не str типа". Если в списке нет элементов, нарушающих ограничение, список валиден.
тогда это будет не list[int], а sequence[int]
Ну линтеры тебе подскажут что ты дурак засунул список строк в список интов
валидация о которой ты говоришь возможна в рантайме только для очень ограниченного подмножества типво
В твоем примере декоратор был бы навешен на foo, и он не обнаружил бы проблемы с управлением типами внутри функции, но я этого и не требую от декоратора
> который проконтролирует, что поступающие в нее параметры соответствуют тайпхинтам ты буквально это требуешь
Так список - изменяемая структура данных. На момент прохода через декоратор аргумент соответствует ограничениям, а внутри функции ты его изменил и он перестал соответствовать
ты как-то вольно трактуешь ограничения. list[int] означает что а) там лежат только инты б) туда можно добавлять только инты первое проверить в рантайме можно второе - нельзя ты почему-то решил, что только первое надо проверять - это некорректно, если ты хочешь использовать объект, а не формировать новый объект с указанным хинтом из него
Я предпочитаю а читать как: "там не лежат не инты", иначе пустой список не подпадает под ограничение
значит ты не знаешь питон - иди учи
Тайпхинты — они не только про настоящее,
> я предпочитаю читать "можно опускать в горячую воду" как "можно есть". с таким подходом ты отравишься
Докажи, что пустой список противоречит хинту list[int]
У меня нет цели контролировать все, моя цель написать защитную прослойку между типизированным и нетипизированным кодом, чтобы на вход моей типизированной функции из типизированной либы нельзя было подать что-то не то
я тебе выше пример показал
Это пример на другую тему. Ты показал, как на момент бытия аргументом функции что-то подходит под ограничения типов, а после перестает
list[int] означает следующее class list: def __getitem__(self, index: int) -> int: def __setitem__(self, index: int, value: int) -> None: def append(self, value: int) -> None ...
шо? это означает переопределение стандартных типов?
это означает специализацию стандартного типа list, подставляя вместо TypVar типа int
и я по-прежнему не вижу тут противоречия бытию пустого листа
Нет Это хинт Хинт = подсказка
Всё так, пустой лист это тоже list[int]. А что не так?
ну уж на таком то уровне я понимаю, что такое хинты
Ну вот тишка говорит, что это не так
А что аппенд?
append у list[str] принимает str, а у list[int] принимает int
Тогда в чём проблема я не пойму? Это не означает что ты не можешь туда что нибудь кроме строки положить Или получаешь только int Это значит, что я как разработчик говорю: мой список ЗАДУМАН только с этим типом работать
Чел, ты не врубаешься в вопрос, не лезь
вообще он прав
А ты в тайп хинты 🌚
Ну мне так до сих пор и не доказали, что пустой список не подпадает под list[int]
Если ты почему-то думаешь, что whateve[int] == все элементы whateve числа - это не так. whateve[int] говорит что ВО ВСЕХ методах, где был указан TypeVar теперь стоит int. Включая мутирующие методы. В рантайме эта инфа недоступна из-за type erasure
сука, термя разными способами сказал
Потому что ты непонимаешь что такое тайпвар и генерик?
Да, но прикол-то в том, что я и не отстаивал позицию, которую ты мне приписываешь, перечитай еще раз мое сообщение
Список сам по себе может попадать под что угодно. А проверяется переменная.
твоя позиция: "я могу отличать list[str] и list[int] по экземпляру пустого списка"? или нет?
я заранее прошу прощения
передай туда a: list[str] = [] oof(a) https://t.me/ru_python/2156492
Моя доебка касалась вот этой формулировки. Если ее принять, список list[int] пустым быть не может, потому что в нем обязаны лежать инты, т.е. количество интов должно быть больше или равно одному. Моя формулировка говорит все то же самое, но через отрицание, что позволяет хранить в списке любое количество интов, включая 0. Я все еще не понимаю, в чем я не прав, ты привел кучу примеров, уводящих от темы.
> потому что в нем обязаны лежать инты только инты != хотя бы один инт. это можно трактовать как "любое что там лежит - инт"
Мне кажется у него проблемы именно лексического характера
Бр... Где ты такую формулировку увидел?
Я тебе пытаюсь донести, что пустой список, определенный как list[str] НЕ может хранить int. То есть, текущее содержимое списка - недостаточная информация для определения что в нем может лежать
Давай еще раз. Ты говоришь: "там лежат только инты" Я говорю: "там не лежат не инты" Мы буквально утверждаем одно и то же, кроме количества интов
Ну вот ты мне на это написал, что надо идти учить питон
Погоди Т.е. твой вопрос в том, является ли истинной что [] == list[int]?
Ну не декоратор, но mypyc есть
я тебе сказал что надо учить питон, потому что ты утверждал что достаточно проверить содержимое списка чтобы понять его полный тип
Не я в плане логическом Типа раз он пуст, он попадает под обозначение list[int]
Нет, такого я не говорил
Опять неправильно
https://t.me/ru_python/2156497
А раз функция все равно контракт нарушает, зачем нам тратить процессорное время на проверку соблюдения её контракта? 🌚
Да, тут все верно, список валиден, пока не будет изменен так, чтобы не быть валидным
Эти фразы ничего не говорят о количестве. "Только" не значит "как миниум один".
Да, но "лежат" — это позитивное утверждение. Кога я говорю "в моей сумочке лежат яйца", ты не поймешь это так, что там возможно 0 яиц. Ты не распарсишь это в утверждение о сумочке, что она для переноски яиц. Ты поймешь это как утверждение о яйцах, что они лежат в сумочке.
"Только" — как раз сделает это фразой о сумочке для переноски яиц.
Ты это к тому что пустой list[str] не вызовет ошибки при проверке его на соответствие list[int]?
list[int] - это не "сумка с яйцами или пустая", это "сумка только для яиц" Но сумка только для яиц может быть в разные моменты времени пустая или только с яйцами
Или унаследованная от сумки котомка с киндер-сюрпризами, которые кто-то догадался унаследовать от яиц...
Блин, заинтриговал Надо подумать почему оно так
есть понятие type erasure. то есть в рантайме мы не храним параметры generic типов на экземпляре. В частности это сделано потому что часто тип выводится, а не задается явно
Прошу прощение если будет глупое уточнение - это в следствии подхода "Что крякает как утка и плавает как утка, скорее всего является уткой"?
А оказалось утконосом
Окей , тогда почитаю Спасибо!
да в общем хз что читать ещё кроме того что я сказал. Ты просто по объекту не мжешь сказать тайпхинт
Обсуждают сегодня