From d84930cf41ba3c1580310d93cb0748ba246b1c47 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 27 Mar 2021 13:55:10 -0400 Subject: [PATCH] Freeze the defaultdict after construction and re-enable lazy evaluation of the search results. --- importlib_metadata/__init__.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/importlib_metadata/__init__.py b/importlib_metadata/__init__.py index fe81c778..0dd0ec55 100644 --- a/importlib_metadata/__init__.py +++ b/importlib_metadata/__init__.py @@ -14,13 +14,13 @@ import contextlib import collections +from ._collections import freezable_defaultdict from ._compat import ( NullFinder, + Protocol, PyPy_repr, install, - Protocol, ) - from ._functools import method_cache from ._itertools import unique_everseen @@ -659,8 +659,8 @@ class Lookup: def __init__(self, path: FastPath): base = os.path.basename(path.root).lower() base_is_egg = base.endswith(".egg") - self.infos = collections.defaultdict(list) - self.eggs = collections.defaultdict(list) + self.infos = freezable_defaultdict(list) + self.eggs = freezable_defaultdict(list) for child in path.children(): low = child.lower() @@ -674,6 +674,9 @@ def __init__(self, path: FastPath): legacy_normalized = Prepared.legacy_normalize(name) self.eggs[legacy_normalized].append(path.joinpath(child)) + self.infos.freeze() + self.eggs.freeze() + def search(self, prepared): infos = ( self.infos[prepared.normalized] @@ -685,7 +688,7 @@ def search(self, prepared): if prepared else itertools.chain.from_iterable(self.eggs.values()) ) - return list(itertools.chain(infos, eggs)) + return itertools.chain(infos, eggs) class Prepared: