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