Prompt y alcance
Python 3.14 añade annotationlib para recuperar anotaciones cuando la evaluación se difiere. El cargador debe admitir referencias hacia adelante, evitar ejecutar expresiones de anotación arbitrarias durante el descubrimiento y proporcionar una ruta de compatibilidad para versiones anteriores de Python. La habilidad principal es la introspección en tiempo de ejecución y el control de efectos secundarios, por lo que esta es una pregunta de coding.
Lo que evalúan los entrevistadores
Las respuestas sólidas distinguen la recuperación de anotaciones de su evaluación. Eligen VALUE, FORWARDREF o STRING según el consumidor, aíslan fallas y definen cuándo se puede evaluar el código de confianza. También abordan la invalidación de caché, la recarga de módulos, los alias de tipos anidados y un fallback versionado en lugar de depender de atributos privados del intérprete.
Preguntas para aclarar primero
- ¿El cargador está inspeccionando código de aplicación de confianza o plugins de terceros?
- ¿El generador de esquemas necesita objetos en tiempo de ejecución, cadenas de texto o referencias no resueltas?
- ¿Qué versiones de Python deben seguir siendo compatibles?
- ¿Se permite que las expresiones de anotación importen módulos o llamen a funciones?
- ¿Cómo se reportan, almacenan en caché y reintentan las fallas después de recargar un plugin?
- ¿Los datos de anotación forman parte de un contrato público de compatibilidad?
Estructura de respuesta de 30 segundos
“Dejaría de llamar a un helper que siempre evalúa las anotaciones. En Python 3.14 usaría annotationlib.get_annotations() con Format.FORWARDREF o Format.STRING para el descubrimiento no confiable, y reservaría Format.VALUE para una fase explícita de confianza. Normalizaría los resultados en un esquema interno, aislaría las fallas por objeto y mantendría un fallback condicionado por versión para versiones anteriores de Python. Las pruebas cubrirían referencias hacia adelante, importaciones opcionales, alias anidados, recargas y reportes deterministas de errores.”
Respuesta paso a paso
Paso 1: Separar el descubrimiento de la evaluación
Define dos fases: el descubrimiento registra nombres u objetos ForwardRef sin resolverlos; la resolución se ejecuta únicamente para módulos y símbolos aprobados. Esto evita que el descubrimiento de esquemas importe dependencias opcionales o ejecute una expresión simplemente porque estaba anotada.
Paso 2: Seleccionar el formato de anotación
Usa Format.STRING cuando el esquema necesite texto similar al código fuente, Format.FORWARDREF cuando los nombres no resueltos deban permanecer estructurados, y Format.VALUE solo cuando se requieran objetos en tiempo de ejecución y la evaluación sea de confianza. Trata la elección del formato como parte del contrato de la API del cargador.
Paso 3: Contener fallas y efectos secundarios
Captura errores de resolución por función ejecutable o clase, adjunta la ruta del objeto y el formato a los diagnósticos, y continúa descubriendo plugins independientes. No conviertas silenciosamente una referencia no resuelta en Any; eso oculta defectos de compatibilidad. Aplica una lista de permitidos antes de evaluar importaciones o símbolos.
Paso 4: Añadir compatibilidad versionada
En Python 3.14+, usa la API documentada de annotationlib. En versiones anteriores, usa la capa de compatibilidad existente del proyecto y documenta sus garantías más débiles. Evita __annotate__ privado o elementos internos del intérprete como una interfaz a largo plazo.
Paso 5: Probar determinismo y ciclo de vida
Prueba anotaciones que hagan referencia a definiciones posteriores, módulos faltantes, alias genéricos anidados, cadenas de texto y recargas de módulos. Asegura que el descubrimiento no importe módulos bloqueados, que las lecturas repetidas produzcan el mismo esquema normalizado y que las cachés se invaliden cuando la identidad o la fuente del plugin cambien.
Respuesta modelo
“El error es una violación de fases: el descubrimiento está evaluando datos que solo deberían describir un esquema. Usaría la API documentada de annotationlib de Python 3.14, seleccionando STRING o FORWARDREF para la inspección no confiable y VALUE únicamente en un resolvedor explícito de confianza. Cada objeto obtiene diagnósticos aislados, las referencias no resueltas permanecen visibles y una lista de permitidos controla la evaluación. Un adaptador de versiones preserva el comportamiento para versiones anteriores de Python. Las pruebas cubren referencias hacia adelante, módulos opcionales faltantes, alias, recargas, importaciones con efectos secundarios y una salida normalizada estable.”
Errores comunes
- Evaluar siempre las anotaciones → las importaciones opcionales y las expresiones se ejecutan durante el descubrimiento → separa formatos y fases.
- Convertir fallas a
Any→ la desviación del esquema se vuelve silenciosa → conserva referencias no resueltas y diagnósticos. - Usar campos privados del intérprete → las actualizaciones rompen el cargador → depende de la documentación de
annotationlib. - Compartir una sola caché global → las recargas devuelven esquemas desactualizados → usa claves e invalida por identidad y fuente del plugin.
- Resolver cada plugin con privilegios completos → el código no confiable adquiere efectos secundarios → usa una lista de permitidos y una fase de confianza.
- Probar solo tipos integrados simples → las referencias hacia adelante fallan en producción → incluye nombres faltantes y alias anidados.
Preguntas de seguimiento
Pregunta de seguimiento 1: ¿Cuándo es apropiado VALUE?
Cuando el consumidor necesita objetos de tipo en tiempo de ejecución y el módulo y las expresiones de anotación son de confianza. Debe ser una fase de resolución explícita, no el comportamiento de descubrimiento predeterminado.
Pregunta de seguimiento 2: ¿Por qué conservar FORWARDREF en lugar de cadenas de texto?
Conserva las referencias no resueltas como valores estructurados, lo que permite a un resolvedor posterior distinguir un nombre faltante de una anotación de cadena ordinaria.
Pregunta de seguimiento 3: ¿Qué cambia en Python 3.14?
Las anotaciones se difieren de forma predeterminada, y annotationlib proporciona formatos documentados para recuperarlas. El código que asumía una evaluación ansiosa debe definir el formato deseado.
Pregunta de seguimiento 4: ¿Cómo das soporte a versiones anteriores?
Usa un adaptador pequeño condicionado por versión sobre el fallback existente del proyecto, documenta las diferencias y ejecuta las mismas pruebas de contrato en cada intérprete admitido.