From 81a5983ed47584cf1b53ab03cf856dcf83e9c7a6 Mon Sep 17 00:00:00 2001 From: deedy5 <65482418+deedy5@users.noreply.github.com> Date: Sun, 3 May 2026 22:31:13 +0300 Subject: [PATCH] refactor(ddgs): improve engine selection and error handling Replace the try-except block with a more robust mechanism for validating engine keys. This change ensures that invalid or disabled engines are gracefully handled by logging a warning with the specific invalid keys instead of raising a KeyError, and provides a fallback to 'auto' if no valid engine instances can be initialized. --- ddgs/ddgs.py | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/ddgs/ddgs.py b/ddgs/ddgs.py index f3783a7..795c726 100644 --- a/ddgs/ddgs.py +++ b/ddgs/ddgs.py @@ -313,31 +313,40 @@ def _get_engines( else: keys = backend_list - try: - engine_classes = [ENGINES[category][key] for key in keys] - # Initialize and cache engine instances - instances = [] - for engine_class in engine_classes: - # If already cached, use the cached instance - if engine_class in self._engines_cache: - instances.append(self._engines_cache[engine_class]) - # If not cached, create a new instance - else: - engine_instance = engine_class(proxy=self._proxy, timeout=self._timeout, verify=self._verify) - self._engines_cache[engine_class] = engine_instance - instances.append(engine_instance) - - # sorting by `engine.priority` - instances.sort(key=lambda e: (e.priority, random), reverse=True) - except KeyError as ex: + engine_classes = [] + invalid_keys = [] + for key in keys: + if engine_class := ENGINES[category].get(key): + engine_classes.append(engine_class) + else: + invalid_keys.append(key) + + if invalid_keys: logger.warning( - "%r - backend is not exist or disabled. Available: %s. Using 'auto'", - ex, + "%s - backends do not exist or are disabled. Available: %s", + ", ".join(sorted(invalid_keys)), ", ".join(sorted(engine_keys)), ) + + # Initialize and cache engine instances + instances = [] + for engine_class in engine_classes: + # If already cached, use the cached instance + if engine_class in self._engines_cache: + instances.append(self._engines_cache[engine_class]) + # If not cached, create a new instance + else: + engine_instance = engine_class(proxy=self._proxy, timeout=self._timeout, verify=self._verify) + self._engines_cache[engine_class] = engine_instance + instances.append(engine_instance) + + if not instances: + logger.warning("backend is not set. Using 'auto'") return self._get_engines(category, "auto") - else: - return instances + + # sorting by `engine.priority` + instances.sort(key=lambda e: (e.priority, random), reverse=True) + return instances def _search_sync( # noqa: C901, PLR0912 self,