Я читаю код модуля ввода, а также изучаю mypy, чтобы понять, как он выполняет проверку типов. К сожалению для меня, mypy
строит очень умное дерево с типизированными выражениями, которые я до сих пор не понимаю, и все это основано на статическом анализе.
Я хотел бы реализовать динамическую систему проверки типов (без статического анализа) в Python. Предполагая, что функция, выполняющая проверки типов, называется check_type
, я хочу выполнить следующее:
>>> import typing
>>>
>>> check_type(1, int)
True
>>> check_type(1, float)
False
>>> check_type([1], typing.List[int])
True
>>> check_type([1], typing.List[float])
False
>>> check_type([1], typing.List[typing.Any])
True
>>> check_type((1,), typing.Tuple[int])
True
Я думал о воссоздании типа объекта из его значения, например:
>>> get_type([1])
typing.List<~T>[int]
Но это не работает с issubclass
:
>>> issubclass(typing.List[int], typing.List[typing.Any])
False
Я не вижу простого способа проверить типы в Python, не предполагая множество вещей о внутренняя часть модуля typing
stdlib (например, доступ к __args__
или __tuple_params__
).
Как я могу правильно реализовать функцию check_type
, которая работает для перечисленных выше случаев? Я использую Python 2.7.
isinstance
? - person user2357112 supports Monica   schedule 22.06.2016isinstance
не проверяет тип полностью. Например:isinstance(['string'], typing.List[int]) is True
когда это не совсем то, что я ищу. - person Hugo Tavares   schedule 22.06.2016check_type
. Как только вы это сделаете, вам просто нужно переместить их с бумаги в надлежащую реализацию. Кажется, вы не уверены, какcheck_type
должен работать с самого начала. Что вообще означаетI would like to implement a type check system that is dynamic (no static analysis) in Python.
? В Python нет статического анализа. - person freakish   schedule 22.06.2016try/except
и обрабатывать значение, которое вы хотите проверить, как значение, которое вы ожидаете, и если возникает исключениеTypeError
, сделайте что-то еще или просто передайте - person danidee   schedule 22.06.2016[1]
, а затем['foo']
)? Наверняка похоже. Кроме того, если вы говорите, что[1]
имеет типList[int]
, то это означает, что вы смотрите на объект, присоединенный к списку. - person freakish   schedule 22.06.2016