2

imghdrPython標準ライブラリの一部であるモジュールのソースコードを調べていました(私は2.7を使用しています)。構造は非常に単純です。what関数は、 のような名前の関数のリストを反復処理しtest_filetype、渡されたファイルがいずれかのテストに一致する場合、そのファイル タイプの文字列を返します。

すべてのtest_filetype関数は 2 つの引数を取りhますfhの内容を含む文字列でf.read(32)f開いているファイル オブジェクトです。どのtest_filetype関数も実際には何にも使用fされません。

関数のセットがtest_filetypeすべて、使用されない引数を取るのはなぜですか?

4

1 に答える 1

2

私の推測では、これはカスタム関数を に追加できるようにするためのものimghdr.testsです。モジュールドキュメントimghdrから-

imghdrこの変数に追加することで、認識できるファイル タイプのリストを拡張できます。

imghdr.test

個々のテストを実行する関数のリスト。各関数は 2 つの引数を取ります: バイトストリームと開いているファイルのようなオブジェクトです。what() がバイトストリームで呼び出されると、ファイルのようなオブジェクトは None になります。

テスト関数は、テストが成功した場合は画像の種類を説明する文字列を返し、失敗した場合は None を返します。

ドキュメントからわかるように、imghdrモジュールはリストへの拡張を許可しtestsます。fこのリストに追加されたこれらのカスタム関数には、追加の引数が存在する可能性があると思います。

imghdr.what()機能を見てみましょう-

if h is None:
    if isinstance(file, basestring):
        f = open(file, 'rb')
        h = f.read(32)
    else:
        location = file.tell()
        h = file.read(32)
        file.seek(location)

ご覧のとおりwhat()、関数にファイル名を送信すると、ファイルから最初の 32 バイトのみが読み取られ、それらの 32 バイトのみが関数のh引数に送信されます。最初のバイトが画像形式を決定するのに十分ではありません (特にカスタム テストの場合)。testf32

于 2015-09-28T15:51:24.853 に答える