Представляем simtypes: лёгкая проверка аннотаций типов во время выполнения.
Проверяет общее соответствие Python-значения аннотации типа, не перебирая коллекции рекурсивно и не изменяя значение.
На этой странице 3 раздела
Аннотации типов говорят, какое значение ожидает Python-функция или настройка. Но во время работы программы встроенный isinstance() не умеет напрямую проверять подсказки вроде «целое число или None» и list[str]. При выборе функции, регистрации плагина или чтении настройки часто нужен только быстрый ответ «подходит или нет», без полного разбора и преобразования значения.
Самописная функция приводит к разным правилам в каждом проекте. Typeguard, Beartype и Pydantic решают более широкую задачу: глубоко проверяют структуру, принудительно контролируют типы или преобразуют данные. Для простого ответа «да» или «нет» это может быть избыточно.
simtypes — Python-библиотека без зависимостей для этой конкретной проверки. Её единственная функция check() понимает обычные классы, варианты вроде int | str, необязательные значения, Any, None и внешний контейнер в подсказках вроде list[str]. Релиз доступен на GitHub.
Проверки во время выполнения
Библиотека экспортирует check(type, value) -> bool, где первым аргументом передаётся тип:
from simtypes import check
check(int, 42) # True
check(int | None, None) # True
check(list[str], [1, 2, 3]) # True
Последний результат намеренный: list[str] проверяет только то, является ли значение списком. Обычные классы проходят через isinstance, а для Any, None, объединений, optional-аннотаций и внешних типов есть явные правила.
Поэтому стоимость проверки не растёт с длиной коллекции, но simtypes не подходит для недоверенных вложенных данных или полной статической аннотации.
Здесь нет обязательных зависимостей, декораторов, перехвата импортов, преобразования значений и схем: вызывающий код получает bool и сам решает, что с ним делать.
Сравнение с полноценными средствами валидации
Более широкие инструменты лучше подходят для полной валидации. Например, Runtype рекурсивно проверяет коллекции, а simtypes намеренно этого не делает.
Для одного места вызова достаточно локальной функции. simtypes полезен, когда несколько библиотек должны разделять и тестировать одну политику.
Для чего предназначен simtypes
simtypes предназначен для внутренней инфраструктуры, которой нужна быстрая проверка совместимости прямо во время работы программы. Выбор подходящей функции, регистрация плагинов и конфигурация могут использовать одно правило без полноценного фреймворка валидации.