为什么 python imghdr 测试函数将文件作为参数?

why do python imghdr test functions take the file as an argument?

我正在查看 imghdr 模块的源代码,它是 python 标准库的一部分(我使用 2.7)。结构非常简单——一个 what 函数遍历名称如 test_filetype 的函数列表,如果传入的文件与任何测试匹配,它 returns 的字符串该文件类型。

所有 test_filetype 函数都有两个参数,hfh是一个字符串,内容是f.read(32)f是打开的文件对象。 test_filetype 函数中的 None 实际上使用 f 做任何事。

为什么 test_filetype 函数集都采用从未使用过的参数?

我的猜测是,这是为了允许将自定义函数添加到 imghdr.tests。来自 documentation of imghdr module -

You can extend the list of file types imghdr can recognize by appending to this variable:

imghdr.test

A list of functions performing the individual tests. Each function takes two arguments: the byte-stream and an open file-like object. When what() is called with a byte-stream, the file-like object will be None.

The test function should return a string describing the image type if the test succeeded, or None if it failed.

从文档中可以看出,imghdr 模块允许扩展到 tests 列表。我认为添加参数 f 可以用于添加到此列表的这些自定义函数。

看看 imghdr.what() function -

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 个字节,并且只在 h 参数中发送这 32 个字节test 函数,我相信额外的 f 参数可能适用于前 32 字节不足以确定图像格式的情况(尤其是对于自定义测试)。