From d59a5e492be438a633930d955566cf224177aa57 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 1 Jun 2026 19:21:01 +0300 Subject: [PATCH] gh-93417: Add use_system_defaults option for mimetypes --- Lib/mimetypes.py | 21 ++++++++++++--------- Lib/test/test_mimetypes.py | 7 +++++++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 15e8c0a437bfd93..1085a669bf34a42 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -64,7 +64,7 @@ class MimeTypes: URL, and can guess a reasonable extension given a MIME type. """ - def __init__(self, filenames=(), strict=True): + def __init__(self, filenames=(), strict=True, *, use_system_defaults=False): if not inited: init() self.encodings_map = _encodings_map_default.copy() @@ -75,6 +75,14 @@ def __init__(self, filenames=(), strict=True): self.add_type(type, ext, True) for (ext, type) in _common_types_default.items(): self.add_type(type, ext, False) + if use_system_defaults: + # Quick return if not supported + self.read_windows_registry(strict) + for name in knownfiles: + try: + self.read(name, strict) + except OSError: + pass for name in filenames: self.read(name, strict) @@ -395,20 +403,15 @@ def add_type(type, ext, strict=True): return _db.add_type(type, ext, strict) -def init(files=None): +def init(files=None, *, use_system_defaults=True): global suffix_map, types_map, encodings_map, common_types global inited, _db inited = True # so that MimeTypes.__init__() doesn't call us again if files is None or _db is None: - db = MimeTypes() - # Quick return if not supported - db.read_windows_registry() - + db = MimeTypes(use_system_defaults=use_system_defaults) if files is None: - files = knownfiles - else: - files = knownfiles + list(files) + files = () else: db = _db diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py index 1a3b49b87b121f2..f97658fd86bf0ae 100644 --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -230,6 +230,9 @@ def test_init_knownfiles(self): mimetypes.init() self.assertEqual(guess_file_type("file.test2")[0], "testing/test2") + mimetypes.init(use_system_defaults=False) + self.assertEqual(guess_file_type("file.test2")[0], None) + def test_added_types_are_used(self): mimetypes.add_type('testing/default-type', '') mime_type, _ = mimetypes.guess_type('') @@ -272,6 +275,10 @@ def test_init_knownfiles(self): guess_file_type = db.guess_file_type self.assertEqual(guess_file_type("file.test2")[0], None) + db = mimetypes.MimeTypes(use_system_defaults=True) + guess_file_type = db.guess_file_type + self.assertEqual(guess_file_type("file.test2")[0], "testing/test2") + def test_case_sensitivity(self): eq = self.assertEqual eq(self.db.guess_file_type("foobar.html"), ("text/html", None))