LINUX.ORG.RU

Как проверять тип аргументов при вызове функции в Python.

 


0

3

Всем привет.

Объясните, пожалуйста, почему этот код работает:


def pick(l: dict, index: str) -> int:
    return l[index]

words = ['apple', 'peach', 'melon']

print(pick(words, 0))

Тип параметра «l» указан как dict, а при вызове функции тип аргумента - list. Тип параметра «index» - str, при вызове функции - это int.

В этом примере все типы аргументов при вызове функции не соответствуют типам параметров в объявлении функции. И при этом код работает.

Почему?

Ответ на: комментарий от little_fox

https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F

Динами́ческая типиза́ция — приём, используемый в языках программирования и языках спецификации, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов. Примеры языков с динамической типизацией — Smalltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript, Лисп. 
vvn_black ★★★★★
()

Аннотации типов не используются для рантайм проверок. Их можно проверять статически:

% mypy 1.py
1.py:6: error: Argument 1 to "pick" has incompatible type "List[str]"; expected "Dict[Any, Any]"  [arg-type]
1.py:6: error: Argument 2 to "pick" has incompatible type "int"; expected "str"  [arg-type]
Found 2 errors in 1 file (checked 1 source file)
slovazap ★★★★★
()
Ответ на: комментарий от vvn_black

Да. И LISP появился раньше чем вся эта попса типа сишки. И он с динамическим петушением, ИЧСХ на нем писали программы для марсоходов, те трушным программистам «отсутствие» тупизации не мешало, а в Python и подавно число со строкой сложить нельзя, и при передаче всякого непотребства в функцию она и так свалится без всяких дополнительных проверок типов

uwuwuu
()

Проверять где? В рантайме? Typeguard, pydantic. Статически? Mypy. Вручную? Isinstance. Почему работает? Динамическая типизация, аннотации типов только в помощь тебе, не более того. Хочешь чтоб питон но статика и без тормозов - бери cython

upcFrost ★★★★★
()