[New-bugs-announce] [issue4963] mimetypes.guess_extension result changes after mimetypes.init()

S Arrowsmith report at bugs.python.org
Fri Jan 16 13:04:54 CET 2009

New submission from S Arrowsmith <siona at chiark.greenend.org.uk>:

Asking mimetypes to reload mime.types can cause guess_extension() to
return a different result if multiple extensions are mapped to that mime

>>> import mimetypes
>>> mimetypes.guess_extension('image/jpeg')
>>> mimetypes.init()
>>> mimetypes.guess_extension('image/jpeg')

This is because both the forward (extension to type) and inverse (type
to extension) type mapping dicts are populated by iterating through the
existing forward (extension to type) dict (types_map), then supplemented
by reading from mime.types (or any other files given to init()). The
fully populated forward dict becomes the new types_map. Initially,
types_map is hard-coded, but when the type mapping dicts are
repopulated, by explicitly or implicitly calling init() again, it is
done by iterating over the types_map created by the first init() call,
not the hard-coded one. If the iteration order for a set of extensions
with the same type is different in these two versions of the forward
dict, the order of extensions appearing for that type in the inverse
dict will change. And so the behavior of guess_all_extensions() and
hence guess_extension() will change.

components: Library (Lib)
messages: 79955
nosy: siona
severity: normal
status: open
title: mimetypes.guess_extension result changes after mimetypes.init()
type: behavior
versions: Python 2.4, Python 2.5

Python tracker <report at bugs.python.org>

More information about the New-bugs-announce mailing list