170 похожих чатов

Подскажите, существует ли готовый декоратор, который можно навесить на функцию,

и который проконтролирует, что поступающие в нее параметры соответствуют тайпхинтам?

85 ответов

90 просмотров

это невозможно сделать в рантайме

Evgeniy-Blinov Автор вопроса
Evgeniy Blinov
Почему?

def foo(a: list[int]): a.append(1) a: list[str]=[] foo(a)

Evgeniy-Blinov Автор вопроса
Tishka17
def foo(a: list[int]): a.append(1) a: list[st...

И чего тут невозможного? Пустой список не противоречит указанному ограничению, отклонение от ограничения встретилось 0 раз

Evgeniy Blinov
И чего тут невозможного? Пустой список не противор...

а теперь так: def foo(a: list[int]): a.append(1) a: list[str]=[] foo(a) for x in a: print(a.lower())

Evgeniy Blinov
И чего тут невозможного? Пустой список не противор...

пустой список противоречит указанному ограничению. list[str] означает что туда можно добавлять только строки, а функция туда добавила число

Evgeniy-Blinov Автор вопроса

Тоже нет противоречия, т.к. мы чекаем декоратором только переменные на входе, а что с ними дальше делает функция - не чекаем, функция может нарушать контракт

шта

Evgeniy-Blinov Автор вопроса
Tishka17
пустой список противоречит указанному ограничению....

Почему? Ограничение можно описать как "каждый элемент списка не должен быть не str типа". Если в списке нет элементов, нарушающих ограничение, список валиден.

Tishka17
а теперь так: def foo(a: list[int]): a.append...

Ну линтеры тебе подскажут что ты дурак засунул список строк в список интов

Evgeniy Blinov
Почему? Ограничение можно описать как "каждый элем...

валидация о которой ты говоришь возможна в рантайме только для очень ограниченного подмножества типво

Evgeniy-Blinov Автор вопроса
Tishka17
шта

В твоем примере декоратор был бы навешен на foo, и он не обнаружил бы проблемы с управлением типами внутри функции, но я этого и не требую от декоратора

Evgeniy Blinov
В твоем примере декоратор был бы навешен на foo, и...

> который проконтролирует, что поступающие в нее параметры соответствуют тайпхинтам ты буквально это требуешь

Evgeniy-Blinov Автор вопроса
Tishka17
> который проконтролирует, что поступающие в нее п...

Так список - изменяемая структура данных. На момент прохода через декоратор аргумент соответствует ограничениям, а внутри функции ты его изменил и он перестал соответствовать

Evgeniy Blinov
Так список - изменяемая структура данных. На момен...

ты как-то вольно трактуешь ограничения. list[int] означает что а) там лежат только инты б) туда можно добавлять только инты первое проверить в рантайме можно второе - нельзя ты почему-то решил, что только первое надо проверять - это некорректно, если ты хочешь использовать объект, а не формировать новый объект с указанным хинтом из него

Evgeniy-Blinov Автор вопроса
Tishka17
ты как-то вольно трактуешь ограничения. list[int]...

Я предпочитаю а читать как: "там не лежат не инты", иначе пустой список не подпадает под ограничение

Evgeniy Blinov
Я предпочитаю а читать как: "там не лежат не инты"...

Тайпхинты — они не только про настоящее,

Evgeniy Blinov
Я предпочитаю а читать как: "там не лежат не инты"...

> я предпочитаю читать "можно опускать в горячую воду" как "можно есть". с таким подходом ты отравишься

Evgeniy-Blinov Автор вопроса
Tishka17
> я предпочитаю читать "можно опускать в горячую в...

Докажи, что пустой список противоречит хинту list[int]

Evgeniy-Blinov Автор вопроса

У меня нет цели контролировать все, моя цель написать защитную прослойку между типизированным и нетипизированным кодом, чтобы на вход моей типизированной функции из типизированной либы нельзя было подать что-то не то

я тебе выше пример показал

Evgeniy-Blinov Автор вопроса
Tishka17
я тебе выше пример показал

Это пример на другую тему. Ты показал, как на момент бытия аргументом функции что-то подходит под ограничения типов, а после перестает

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 Автор вопроса
Tishka17
list[int] означает следующее class list: def _...

шо? это означает переопределение стандартных типов?

Evgeniy Blinov
шо? это означает переопределение стандартных типов...

это означает специализацию стандартного типа list, подставляя вместо TypVar типа int

Evgeniy-Blinov Автор вопроса
Tishka17
list[int] означает следующее class list: def _...

и я по-прежнему не вижу тут противоречия бытию пустого листа

Evgeniy Blinov
и я по-прежнему не вижу тут противоречия бытию пус...

Всё так, пустой лист это тоже list[int]. А что не так?

Evgeniy-Blinov Автор вопроса
Python Developer
Нет Это хинт Хинт = подсказка

ну уж на таком то уровне я понимаю, что такое хинты

Evgeniy-Blinov Автор вопроса
Evgeniy-Blinov Автор вопроса
Tishka17
append например

А что аппенд?

Evgeniy Blinov
А что аппенд?

append у list[str] принимает str, а у list[int] принимает int

Evgeniy Blinov
ну уж на таком то уровне я понимаю, что такое хинт...

Тогда в чём проблема я не пойму? Это не означает что ты не можешь туда что нибудь кроме строки положить Или получаешь только int Это значит, что я как разработчик говорю: мой список ЗАДУМАН только с этим типом работать

Evgeniy-Blinov Автор вопроса
Evgeniy-Blinov Автор вопроса
Patrick [in search of work]
А ты в тайп хинты 🌚

Ну мне так до сих пор и не доказали, что пустой список не подпадает под list[int]

Evgeniy Blinov
Чел, ты не врубаешься в вопрос, не лезь

Если ты почему-то думаешь, что whateve[int] == все элементы whateve числа - это не так. whateve[int] говорит что ВО ВСЕХ методах, где был указан TypeVar теперь стоит int. Включая мутирующие методы. В рантайме эта инфа недоступна из-за type erasure

Evgeniy Blinov
Ну мне так до сих пор и не доказали, что пустой сп...

Потому что ты непонимаешь что такое тайпвар и генерик?

Evgeniy-Blinov Автор вопроса
Tishka17
Если ты почему-то думаешь, что whateve[int] == все...

Да, но прикол-то в том, что я и не отстаивал позицию, которую ты мне приписываешь, перечитай еще раз мое сообщение

Evgeniy Blinov
Ну мне так до сих пор и не доказали, что пустой сп...

Список сам по себе может попадать под что угодно. А проверяется переменная.

Evgeniy Blinov
Да, но прикол-то в том, что я и не отстаивал позиц...

твоя позиция: "я могу отличать list[str] и list[int] по экземпляру пустого списка"? или нет?

Jabtanrem Hor
я заранее прошу прощения

передай туда a: list[str] = [] oof(a) https://t.me/ru_python/2156492

Evgeniy-Blinov Автор вопроса
Tishka17
ты как-то вольно трактуешь ограничения. list[int]...

Моя доебка касалась вот этой формулировки. Если ее принять, список list[int] пустым быть не может, потому что в нем обязаны лежать инты, т.е. количество интов должно быть больше или равно одному. Моя формулировка говорит все то же самое, но через отрицание, что позволяет хранить в списке любое количество интов, включая 0. Я все еще не понимаю, в чем я не прав, ты привел кучу примеров, уводящих от темы.

Evgeniy Blinov
Моя доебка касалась вот этой формулировки. Если ее...

> потому что в нем обязаны лежать инты только инты != хотя бы один инт. это можно трактовать как "любое что там лежит - инт"

Tishka17
чо

Мне кажется у него проблемы именно лексического характера

Evgeniy Blinov
Моя доебка касалась вот этой формулировки. Если ее...

Я тебе пытаюсь донести, что пустой список, определенный как list[str] НЕ может хранить int. То есть, текущее содержимое списка - недостаточная информация для определения что в нем может лежать

Evgeniy-Blinov Автор вопроса

Давай еще раз. Ты говоришь: "там лежат только инты" Я говорю: "там не лежат не инты" Мы буквально утверждаем одно и то же, кроме количества интов

Evgeniy-Blinov Автор вопроса
Tishka17
ну ок. дальше?

Ну вот ты мне на это написал, что надо идти учить питон

Evgeniy Blinov
Давай еще раз. Ты говоришь: "там лежат только и...

Погоди Т.е. твой вопрос в том, является ли истинной что [] == list[int]?

Ну не декоратор, но mypyc есть

Evgeniy Blinov
Ну вот ты мне на это написал, что надо идти учить ...

я тебе сказал что надо учить питон, потому что ты утверждал что достаточно проверить содержимое списка чтобы понять его полный тип

Evgeniy Blinov
Нет

Не я в плане логическом Типа раз он пуст, он попадает под обозначение list[int]

Evgeniy-Blinov Автор вопроса
Evgeniy-Blinov Автор вопроса
Evgeniy Blinov
Тоже нет противоречия, т.к. мы чекаем декоратором ...

А раз функция все равно контракт нарушает, зачем нам тратить процессорное время на проверку соблюдения её контракта? 🌚

Evgeniy-Blinov Автор вопроса
Tishka17
https://t.me/ru_python/2156497

Да, тут все верно, список валиден, пока не будет изменен так, чтобы не быть валидным

Evgeniy Blinov
Давай еще раз. Ты говоришь: "там лежат только и...

Эти фразы ничего не говорят о количестве. "Только" не значит "как миниум один".

Evgeniy-Blinov Автор вопроса
evle
Эти фразы ничего не говорят о количестве. "Только"...

Да, но "лежат" — это позитивное утверждение. Кога я говорю "в моей сумочке лежат яйца", ты не поймешь это так, что там возможно 0 яиц. Ты не распарсишь это в утверждение о сумочке, что она для переноски яиц. Ты поймешь это как утверждение о яйцах, что они лежат в сумочке.

Evgeniy Blinov
Да, но "лежат" — это позитивное утверждение. Кога ...

"Только" — как раз сделает это фразой о сумочке для переноски яиц.

Evgeniy Blinov
Да, но "лежат" — это позитивное утверждение. Кога ...

Ты это к тому что пустой list[str] не вызовет ошибки при проверке его на соответствие list[int]?

Evgeniy Blinov
Да, но "лежат" — это позитивное утверждение. Кога ...

list[int] - это не "сумка с яйцами или пустая", это "сумка только для яиц" Но сумка только для яиц может быть в разные моменты времени пустая или только с яйцами

Tishka17
list[int] - это не "сумка с яйцами или пустая", эт...

Или унаследованная от сумки котомка с киндер-сюрпризами, которые кто-то догадался унаследовать от яиц...

Tishka17
def foo(a: list[int]): a.append(1) a: list[st...

Блин, заинтриговал Надо подумать почему оно так

Python Developer
Блин, заинтриговал Надо подумать почему оно так

есть понятие type erasure. то есть в рантайме мы не храним параметры generic типов на экземпляре. В частности это сделано потому что часто тип выводится, а не задается явно

Tishka17
есть понятие type erasure. то есть в рантайме мы...

Прошу прощение если будет глупое уточнение - это в следствии подхода "Что крякает как утка и плавает как утка, скорее всего является уткой"?

Tishka17
нет

Окей , тогда почитаю Спасибо!

Python Developer
Окей , тогда почитаю Спасибо!

да в общем хз что читать ещё кроме того что я сказал. Ты просто по объекту не мжешь сказать тайпхинт

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
У тебя в конфиге нигде нет deny all; или вообще любого deny?
Alexander Sherbakov
10
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Есть ли смысл устраиваться на 1с ? Даст это плюс в дальнейшем трудоустройстве на php? Просто у меня в городе вакансий на пхп нету. Или лучше удаленно искать. Опыта работы нету...
Azamat
14
Ребят, чет я уже не догоняю... Крч в коде на асм там происходит нечто вроде a+число (a+1, a+2 и т.д.). Но почему строка lea ecx, [edx+1] работает как a+1?? В edx берется адрес...
Alan 🔝 Бэброу
4
Карта сайта