2

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

所有test_filetype函数都有两个参数,h并且f. h是一个内容为 的字符串f.read(32),并且f是打开的文件对象。这些test_filetype功能都没有真正f用于任何事情。

为什么这组test_filetype函数都需要一个从未使用过的参数?

4

1 回答 1

2

我的猜测是,这是为了允许将自定义函数添加到imghdr.tests. 从模块的文档imghdr-

imghdr您可以通过附加到此变量来扩展可以识别的文件类型列表:

imghdr.test

执行单个测试的函数列表。每个函数都有两个参数:字节流和打开的类似文件的对象。当使用字节流调用 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 个字节,并且只在函数的h参数中发送这 32 个字节test,我相信附加f参数可能适用于第一个32字节的情况不足以确定图像格式(特别是对于自定义测试)。

于 2015-09-28T15:51:24.853 回答