Документы Python 2 для filecmp ()
говорят:
Если shallow не задан и не является ложным, файлы с идентичные
os.stat ()
подписи считаются равными.
Звучит как два идентичных файла, за исключением их сигнатуры os.stat ()
, будет считаться неравным, однако это не похоже на случай, как показано выполнением следующего фрагмента кода:
import filecmp
import os
import shutil
import time
with open('test_file_1', 'w') as f:
f.write('file contents')
shutil.copy('test_file_1', 'test_file_2')
time.sleep(5) # pause to get a different time-stamp
os.utime('test_file_2', None) # change copied file's time-stamp
print 'test_file_1:', os.stat('test_file_1')
print 'test_file_2:', os.stat('test_file_2')
print 'filecmp.cmp():', filecmp.cmp('test_file_1', 'test_file_2')
Вывод:
test_file_1: nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0,
st_uid=0, st_gid=0, st_size=13L, st_atime=1320719522L, st_mtime=1320720444L,
st_ctime=1320719522L)
test_file_2: nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0,
st_uid=0, st_gid=0, st_size=13L, st_atime=1320720504L, st_mtime=1320720504L,
st_ctime=1320719539L)
filecmp.cmp(): True
Как видите, временные метки двух файлов - st_atime
, st_mtime
и st_ctime
- явно не одно и то же, однако filecmp.cmp ()
указывает, что они идентичны. Я что-то неправильно понимаю или есть ошибка либо в реализации filecmp.cmp ()
, либо в его документации?
Обновление
Документация Python 3 была перефразирована и в настоящее время говорится следующее, что IMHO является улучшением только в том смысле, что это лучше подразумевает, что файлы с разными отметками времени могут по-прежнему считаться равными, даже если shallow
истинно.
Если shallow истинно, файлы с идентичными подписями
os.stat ()
считаются равными. В противном случае сравнивается содержимое файлов.
FWIW Я думаю, было бы лучше просто сказать что-то вроде этого:
Если shallow истинно, содержимое файла сравнивается только тогда, когда
os.stat ()
подписи не равны.