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

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

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

85 ответов

178 просмотров

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

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] по экземпляру пустого списка"? или нет?

ungenuineer 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 Автор вопроса
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
Окей , тогда почитаю Спасибо!

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта