パラメータのドキュメントは誤解を招くと思いますshallow
*。渡すことで、関数がファイルの内容を比較shallow = True
できなくなるわけではありません。filecmp.cmp
ファイルのサイズが同じで が異なる場合mtime
でも、その内容はチェックされます。
Python インストールでの実装を確認するか、 Python ソース リポジトリcmp
で (現時点で最新の) ソースを確認できます。
関連するビットは次のcmp
とおりです。
def cmp(f1, f2, shallow=True):
# long docstring removed
s1 = _sig(os.stat(f1))
s2 = _sig(os.stat(f2))
if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG:
return False
if shallow and s1 == s2:
return True
if s1[1] != s2[1]:
return False
# rest of function, which calls a helper to do the actual file contents comparisons
ヘルパー関数は、ファイルのデータ構造から抽出された値の_sig
タプルを返します。stat
タプルの値は、ファイルの種類、ファイルのサイズ、およびそのmtime
(通常、ファイルの内容が最後に変更されたとき) です。
コードの抜粋に含めたテストでは、これらのメタデータに基づいて 2 つのファイルが同じかどうかをすばやく判断しようとします。いずれかのファイルが「通常の」ファイルでない場合 (ディレクトリまたは特別なシステム ファイルであるため)、それらは等しくないと見なされます。また、サイズが同じでない場合、同じにすることはできません。
パラメータが行うshallow
ことは、迅速な陽性テストを可能にすることです。shallow
が true でファイルのサイズが同じである場合mtime
、filecmp.cmp
はファイルが等しいと想定します。
あなたのプログラムで起こっていると思われるのは、現在のディレクトリにまったく同じサイズのファイルが多数あることです (おそらく内容が非常に似ているため、またはファイルサイズがデータ形式によって固定されているため)。以前のデータ セットには同じサイズのファイルがそれほど多くなかったので、コードはそれらをすばやく除外できました。
* の docstring は誤解を招くため、バグを示していると思いますfilecmp.cmp
(動作が適切に記述されていないか、実際の実装が正しくなく、ドキュメントに合わせて修正する必要があるため)。そして、私は一人ではないようです。数年間更新されていませんが、この問題に関するバグレポートがあります。この質問へのリンクを使用してバグを報告します。誰かが修正に取り組むかもしれません!