Tecnología · GUÍA PRÁCTICA
¿dircmp.diff_files sigue vacío? Renueve ambos resultados y compare todos los archivos comunes
28 comprobaciones locales muestran por qué clear_cache(), un dircmp nuevo por defecto y revisar solo diff_files pueden omitir bytes distintos.

Que dircmp.diff_files esté vacío no demuestra que dos directorios tengan bytes idénticos. En CPython 3.12.14 cambiamos un archivo de cuatro bytes de AAAA a BBBB y conservamos deliberadamente su tamaño y fecha de modificación. Tanto la comparación superficial como una comparación profunda previamente almacenada devolvieron True.
Al vaciar la caché del módulo filecmp, una nueva comparación profunda devolvió False. La lista vacía ya calculada por un dircmp anterior no cambió. Comparar profundamente esa lista diff_files examinó cero nombres. La reparación exige separar ambos estados y revisar todos los archivos comunes actuales bajo una política explícita.
1. Distinga las dos formas de conservar resultados
La firma de comparación de filecmp.cmp incluye tipo, tamaño y fecha de modificación. Con shallow=True, firmas iguales pueden aceptarse sin leer los bytes. shallow=False evita ese atajo, pero la caché documentada todavía puede aportar un resultado anterior si las rutas y las firmas no cambian.
Los atributos de dircmp se calculan de forma diferida y quedan conservados en ese objeto. Evaluamos d0.diff_files antes de modificar el archivo. Tras clear_cache() y un nuevo resultado profundo False, d0.diff_files seguía siendo la lista vacía original. Vaciar la caché del módulo no había reconstruido d0.
2. Reproduzca el fallo con una modificación controlada
Use directorios temporales nuevos que le pertenezcan. Escriba b"AAAA" en ambos report.bin y asigne la misma fecha fija. Ejecute clear_cache(), cmp(a,b,shallow=False), cree d0=filecmp.dircmp(left,right) y lea d0.diff_files. El resultado profundo inicial fue True y la lista estaba vacía.
Cambie solo el archivo derecho a b"BBBB" y restaure su mtime original con os.utime. Las aserciones comprobaron firmas iguales de tipo/tamaño/mtime y bytes realmente distintos. La llamada superficial predeterminada devolvió True; la profunda ya almacenada también. Esta conservación deliberada no mide la resolución temporal de ningún sistema de archivos.
3. Reconstruya el objeto y compare common_files
Detenga o aísle primero a quienes escriben para estabilizar las entradas. En el intérprete 3.12 probado funciona: filecmp.clear_cache(); fresh=filecmp.dircmp(left,right,ignore=[],hide=[]); match,mismatch,errors=filecmp.cmpfiles(left,right,fresh.common_files,shallow=False). Los filtros vacíos son la política de nuestra pequeña prueba, no una recomendación universal de producción.
Tras el cambio, match y errors estaban vacíos y mismatch contenía report.bin. En cambio, pasar fresh.diff_files a cmpfiles devolvió tres listas vacías: el objeto nuevo por defecto seguía siendo superficial y ya había omitido el falso igual. Use common_files como conjunto candidato y conserve left_only, right_only, common_funny y errors en vez de reducir todo a una señal de éxito.
4. Compruebe la versión antes de usar el argumento nuevo
El intérprete 3.12.14 real lanzó TypeError para filecmp.dircmp(left,right,shallow=False). La referencia de Python 3.13 documenta que ese argumento se añadió en 3.13; no ejecutamos esa versión. En una versión compatible ofrece comparación profunda pública, pero no convierte entradas cambiantes en una instantánea atómica ni garantiza actualizar un objeto antiguo ya evaluado.
Un dircmp predeterminado también puede leer contenido cuando no aplica el atajo de metadatos. En el control final, bytes iguales con fechas de modificación distintas dieron True en comparación superficial. Por tanto, superficial no significa solo metadatos en todos los casos, y fechas distintas no bastan para probar contenido diferente.
5. Incluya errores y filtros de nombres
El control missing.bin apareció en errors de cmpfiles, no en mismatch. Tras añadir extra.bin, el right_only ya calculado del objeto antiguo no lo mostraba y el nuevo sí. Otro dircmp creado antes de añadirlo, cuyas listas aún no se habían consultado, lo vio en el primer acceso: construir el objeto no define una instantánea.
Un archivo normal llamado .git dentro de la prueba temporal quedó oculto por ignore predeterminado y apareció con ignore=[],hide=[]. Defina los nombres que quiere comparar. Una lista vacía de diferencias de contenido no prueba igualdad de nombres, tipos, recorrido o permisos. La prueba plana de archivos normales no examinó recursión, seguimiento de enlaces, archivos especiales ni modificaciones simultáneas.
6. Termine con una comprobación independiente de bytes
GNU cmp 3.10 estaba realmente instalado. cmp -s sobre los dos report.bin modificados devolvió 1 y confirmó bytes distintos de forma independiente. El manual original de GNU define 0 como iguales,1 como diferentes y2 como problema de ejecución. Un SHA-256 recién calculado también difería. Un error no debe presentarse como igualdad ni como una diferencia ordinaria de contenido.
Las 28 aserciones pasaron en CPython 3.12.14/Linux. El informe conserva intérprete, plataforma, versión GNU, SHA del programa y resultados. En una auditoría real, informe el ámbito de nombres elegido, el resultado de cada archivo común y los errores pendientes sobre entradas estables. La igualdad de bytes es una observación de contenido; autenticidad, igualdad de metadatos y consistencia durante escrituras necesitan garantías separadas.
