¿Cómo realizar la comprobación de tipo con el módulo de escritura de Python?

Estoy leyendo el código del módulo de escritura y también estoy buscando en mypy para entender cómo funciona la comprobación de tipos. Desafortunadamente para mí, mypy construye un árbol muy inteligente con expresiones escritas que todavía no entiendo, y todo está basado en un análisis estático.

Me gustaría implementar un sistema de verificación de tipos que sea dynamic (sin análisis estático) en Python. Suponiendo que la función que realiza las comprobaciones de tipo se llama check_type , quiero lograr lo siguiente:

 >>> 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 

Pensé en recrear el tipo de objeto a partir de su valor, como por ejemplo:

 >>> get_type([1]) typing.List[int] 

Pero esto no funciona con issubclass :

 >>> issubclass(typing.List[int], typing.List[typing.Any]) False 

No veo una forma sencilla de verificar tipos en Python sin asumir muchas cosas sobre los aspectos internos del módulo de typing estándar (por ejemplo, acceder a __args__ o __tuple_params__ ).

¿Cómo puedo implementar correctamente una función check_type que funcione para los casos enumerados anteriormente? Estoy usando Python 2.7.

Puede obtener fácilmente la funcionalidad muy limitada que funciona correctamente para los ejemplos simples proporcionados en su pregunta:

 import mypy.api def check_type(value, typ): program_text = 'from typing import *; v: {} = {}'.format(typ, repr(value)) normal_report, error_report, exit_code = mypy.api.run(['-c', program_text]) return exit_code == 0 int_ = 1 str_ = 'a' list_str_ = ['a'] list_int_ = [1] tuple_int_ = (1,) assert check_type(int_, 'int') assert not check_type(str_, 'int') assert check_type(list_int_, 'List[int]') assert not check_type(list_str_, 'List[int]') assert check_type(list_int_, 'List[Any]') assert check_type(tuple_int_, 'Tuple[int]') 

Incluso puede hacer algunas cosas más avanzadas (por ejemplo, consulte los tipos que corresponden a las clases que definió en su progtwig) extendiendo este código un poco, de modo que mypy pueda analizar todo su código fuente en lugar de solo la línea actual .

De forma alternativa, es posible que desee ver la aplicación o la protección de tipo .