Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿TOML declara una tabla dos veces? Revise la ruta antes de borrar el encabezado

Nombres entre comillas, claves con puntos y secciones generadas pueden colisionar aunque el texto cambie. Preserve el original, verifique el árbol y pruebe la siguiente generación.

Diagrama original de las rutas de claves TOML
Ilustración original: distinga comillas equivalentes de puntos literales dentro del nombre. Watch at Ease

El error señala una ruta semántica, no necesariamente dos líneas idénticas. Preserve el archivo e identifique quién lo escribe antes de borrar encabezados, cambiar claves o repetir un instalador.

1. Preserve el archivo exacto y su escritor

Copie el original antes de editar. Registre ruta realmente leída, versión del parser/Python, error completo y si el archivo es manual, fusionado o generado. La línea indicada suele ser la segunda declaración: busque otra anterior que ocupe la misma ruta en lugar de borrarla inmediatamente.

Detenga el paso de generación que falla mientras revisa su salida. Distinga valores administrados y propios del usuario. No envíe una configuración completa con credenciales a un validador en línea: cree una reproducción mínima censurada que conserve la estructura conflictiva.

2. Compare componentes semánticos, no cadenas de texto

En CPython3.12.14, [service.api] seguido de [service."api"] falló: citar el mismo componente no crea otra tabla. En cambio, [service."api.v1"] y [service.api.v1] produjeron árboles distintos. El primero tiene una clave literal api.v1; el segundo anida v1 bajo api. Mover comillas puede cambiar el significado, no solo el formato.

Anote cada componente y su valor previsto. No divida los encabezados por todos sus puntos: uno dentro de comillas forma parte del nombre. Los espacios o una escritura equivalente entre comillas no son una prueba fiable de unicidad para el generador.

3. Identifique cómo se definió antes la ruta

Las pruebas rechazaron service=1 seguido de [service.api], y service.api.port=8000 seguido de [service.api]. También falló intentar ampliar [service.api] después de service={api={port=8000}} en línea. Son conflictos de valor/tabla o declaración; la sangría no repara su significado.

Un padre implícito es distinto. [service.api] con port, seguido de [service] con name, se analizó correctamente. Consolidar dos secciones service.api en una con port y host también funcionó. Determine qué declaración posee la tabla y preserve cada valor necesario. No invente una política de último valor ganador ni borre bloques enteros a ciegas.

4. Valide el árbol y la siguiente escritura

Analice una copia candidata con el parser compatible de la aplicación. En Python3.11+, tomllib.load recibe un archivo abierto en binario y tomllib.loads una cadena. Valida sintaxis TOML, no las opciones de la aplicación, y no escribe archivos. Las ocho pruebas usaron CPython3.12.14/TOML1.0; Python3.15 añade TOML1.1, una diferencia que debe explicitarse.

Compruebe rutas, tipos y valores requeridos y ejecute la validación segura de la aplicación. Si hay un generador, ejecútelo dos veces sobre una copia desechable: ambas salidas deben analizarse, conservar valores propios y no añadir tablas duplicadas. Solo entonces sustituya el archivo con respaldo disponible. Una reparación manual no está completa si la siguiente generación lo corrompe; arregle el escritor o use su versión corregida documentada.

Diagrama de validación de una reparación TOML
Ilustración original: preserve el archivo y compruebe sintaxis, valores y dos generaciones. Watch at Ease