一个符合RFC1524的带补丁的mailcap模块
mailcap-fix的Python项目详细描述
安装
$ pip install mailcap-fix
示例
考虑一个包含以下两行的mailcap文件
image/*; feh %s image/jpeg; eog %s
因为image/*条目是首先定义的,所以它应该 搜索匹配项时优先于image/jpeg项。 此行为由RFC 1524定义。 但是,标准库的实现将始终评估 最后是通配符项。
之前
>>>importmailcap>>>d=mailcap.getcaps()>>># Incorrectly returns the second entry>>>mailcap.findmatch(d,'image/jpeg',filename='test.jpg')('eog test.jpg',{'view':'eog %s'})
之后
>>>frommailcap_fiximportmailcap>>>d=mailcap.getcaps()>>># Correctly returns the wildcard entry>>>mailcap.findmatch(d,'image/jpeg',filename='test.jpg')('feh test.jpg',{'view':'feh %s','lineno':0})
工作原理
此修补程序的目标是符合RFCC 1524, 同时保持尽可能多的向后兼容性,而不添加任何“魔法”。
mailcap_fix为mailcap dict中的每个条目添加一个新字段lineno。 然后,在搜索匹配项时,使用此行号按降序对条目进行排序。 为了向后兼容,如果lineno不存在,条目将不会被排序。 因为rfc 1524定义了有效mailcap字段名的白名单,所以添加lineno 不应与任何其他mailcap字段冲突。
基准
python 3.4.0
ubuntu 14.04 LTS 64位
Intel®Core™i5-3210M CPU@2.50GHz×4
8千兆内存
mailcap.get_caps() - per file | ||
---|---|---|
mailcap | mailcap_fix | |
mailcap_short.txt | 0.081881 ms | 0.084525 ms |
mailcap_long.txt | 17.746289 ms | 18.407623 ms |
mailcap.lookup() - avg function call | ||
---|---|---|
mailcap | mailcap_fix | |
mailcap_short.txt | 0.000996 ms | 0.003144 ms |
mailcap_long.txt | 0.000798 ms | 0.002731 ms |