Как я могу использовать функцию внутренней проверки типов mypy?

Я работаю над системой, которая позволяет вам использовать графический интерфейс для написания базового Python для использования в качестве сценариев в приложении.

Одна из вещей, которые он делает, - позволяет вам установить атрибут в какое-то значение, и я хочу посмотреть, может ли он быть обработан одним из обработчиков типов, которые реализованы в графическом интерфейсе. Встроенный модуль набора текста на Python не имеет возможности проверить, является ли str допустимым типом для Optional[str] или int допустимым для Union[float, int, complex] и т. Д.

Однако mypy выполняет эту проверку типа статически и имеет функцию под названием is, который, я думаю, отлично подойдет в этом случае; однако, когда я вызываю его с типами python, я получаю исключение TypeError: mypy.types.Type object expected; got type, см. код ниже.

Внутренние компоненты mypy довольно сложны, и я не могу найти четкого пути от типов python к тому, что mypy ожидает внутри, есть ли простой способ превратить собственные типы python в типы mypy или другую функцию, которую я должен использовать в mypy, чтобы проверить совместимость типов во время выполнения?

from mypy.subtypes import is_subtype
is_subtype(float, int)

person Mark Omo    schedule 29.07.2020    source источник


Ответы (2)


mypy не предназначен для использования в качестве импортированной библиотеки. Единственное поддерживаемое использование - через интерфейс командной строки (запуск напрямую или как демон). Нет поддержки тому, что вы пытаетесь сделать.

Понятие типа или подтипа mypy имеет смысл только во время статического анализа, а не во время выполнения. Понятие типа mypy работает с точки зрения исходного кода и информации синтаксического анализа и полностью отделено от любых объектов среды выполнения, используемых для представления типов. В общем случае невозможно даже определить, какой тип увидел бы mypy, учитывая объект среды выполнения, представляющий тип. Например, NewType объекты не содержат достаточно информации для восстановления их исходного исходного местоположения, а переменные типа означают разные вещи в разных контекстах таким образом, что их невозможно восстановить во время выполнения.

Даже если вам удастся выкопать достаточно деталей реализации, чтобы приблизиться к работе, все это может сломаться со следующим обновлением, поскольку нет никаких гарантий обратной совместимости для такого неподдерживаемого использования внутренних компонентов mypy.

person user2357112 supports Monica    schedule 29.07.2020
comment
Я заметил, что mypy ожидает, что все его типы будут иметь исходные местоположения, но это, похоже, используется только для отслеживания изменений файла дельты после его анализа. Можете ли вы подробнее рассказать о том, как информация о типе, полученная во время выполнения с помощью inspect.signature, отличается от того, что использует mypy? Он выводит красивые ошибки, такие как got Tuple [Union [str, int], Union [str, int]], ожидаемый Tuple [int, int], которые выглядят точно так же, как информация о типе, которую я могу получить во время выполнения. - person Mark Omo; 30.07.2020

Как упоминалось в user2357112, mypy не предназначен для этого. После разговора с кем-то, кто хорошо знаком с внутренним устройством, лучшим ответом будет некоторая версия передачи фрагментов кода в AST, а затем их загрузка в недра mypy.

Однако pytypes разработан для обеспечения этой функциональности и предоставляет функцию под названием is_subtype some пример использования:

from pytypes import is_subtype

print(is_subtype(float, int))
# prints 'False'

print(is_subtype(float, Optional[float]))
# prints 'True'
person Mark Omo    schedule 30.07.2020