From 8de35bdfa13a4a2b550388934a9f173028aec604 Mon Sep 17 00:00:00 2001 From: Timmy Welch Date: Fri, 10 Jan 2025 16:25:10 -0800 Subject: [PATCH] Fix default dict creating unnecessary keys --- comicapi/merge.py | 11 +++++------ comicapi/utils.py | 28 +++++++++++++++++++++++----- comictalker/talkers/comicvine.py | 3 +-- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/comicapi/merge.py b/comicapi/merge.py index 7ca46fe..3fa8fbe 100644 --- a/comicapi/merge.py +++ b/comicapi/merge.py @@ -1,12 +1,11 @@ from __future__ import annotations import dataclasses -from collections import defaultdict from collections.abc import Collection from enum import auto from typing import Any -from comicapi.utils import StrEnum, norm_fold +from comicapi.utils import DefaultDict, StrEnum, norm_fold @dataclasses.dataclass @@ -55,19 +54,19 @@ def overlay(old: Any, new: Any) -> Any: return new -attribute = defaultdict( - lambda: overlay, +attribute = DefaultDict( { Mode.OVERLAY: overlay, Mode.ADD_MISSING: lambda old, new: overlay(new, old), }, + default=lambda x: overlay, ) -lists = defaultdict( - lambda: overlay, +lists = DefaultDict( { Mode.OVERLAY: merge_lists, Mode.ADD_MISSING: lambda old, new: merge_lists(new, old), }, + default=lambda x: overlay, ) diff --git a/comicapi/utils.py b/comicapi/utils.py index 977cb15..f9dbae0 100644 --- a/comicapi/utils.py +++ b/comicapi/utils.py @@ -22,11 +22,10 @@ import pathlib import platform import sys import unicodedata -from collections import defaultdict from collections.abc import Iterable, Mapping from enum import Enum, auto from shutil import which # noqa: F401 -from typing import Any, TypeVar, cast +from typing import Any, Callable, TypeVar, cast from comicfn2dict import comicfn2dict @@ -107,6 +106,17 @@ else: logger = logging.getLogger(__name__) +class DefaultDict(dict): + def __init__(self, *args, default: Callable[[Any], Any] | None = None) -> None: + super().__init__(*args) + self.default = default + + def __missing__(self, key: Any) -> Any: + if self.default is None: + return key + return self.default(key) + + class Parser(StrEnum): ORIGINAL = auto() COMPLICATED = auto() @@ -360,7 +370,9 @@ def xlate_float(data: Any) -> float | None: if isinstance(data, (int, float)): i = data else: - i = str(data).translate(defaultdict(lambda: None, zip((ord(c) for c in "1234567890."), "1234567890."))) + i = str(data).translate( + DefaultDict(zip((ord(c) for c in "1234567890."), "1234567890."), default=lambda x: None) + ) if i == "": return None try: @@ -493,9 +505,9 @@ def parse_version(s: str) -> tuple[int, int, int]: return (parts[0], parts[1], parts[2]) -_languages: dict[str | None, str | None] = defaultdict(lambda: None) +_languages: dict[str | None, str | None] = DefaultDict(default=lambda x: None) -_countries: dict[str | None, str | None] = defaultdict(lambda: None) +_countries: dict[str | None, str | None] = DefaultDict(default=lambda x: None) def countries() -> dict[str | None, str | None]: @@ -517,6 +529,8 @@ def languages() -> dict[str | None, str | None]: def get_language_from_iso(iso: str | None) -> str | None: + if not _languages: + return languages()[iso] return _languages[iso] @@ -529,10 +543,12 @@ def get_language_iso(string: str | None) -> str | None: lang = string.casefold() found = None + for lng in isocodes.extendend_languages.items: for x in ("alpha_2", "alpha_3", "bibliographic", "common_name", "name"): if x in lng and lng[x].casefold() == lang: found = lng + # break if found: break @@ -542,6 +558,8 @@ def get_language_iso(string: str | None) -> str | None: def get_country_from_iso(iso: str | None) -> str | None: + if not _countries: + return countries()[iso] return _countries[iso] diff --git a/comictalker/talkers/comicvine.py b/comictalker/talkers/comicvine.py index afd7ef7..38a2f5e 100644 --- a/comictalker/talkers/comicvine.py +++ b/comictalker/talkers/comicvine.py @@ -22,7 +22,6 @@ import json import logging import pathlib import time -from collections import defaultdict from typing import Any, Callable, Generic, TypeVar, cast from urllib.parse import parse_qsl, urljoin @@ -186,7 +185,7 @@ class ComicVineTalker(ComicTalker): self.default_api_url = self.api_url = f"{self.website}/api/" self.default_api_key = self.api_key = "27431e6787042105bd3e47e169a624521f89f3a4" self.use_series_start_as_volume: bool = False - self.total_requests_made: dict[str, int] = defaultdict(int) + self.total_requests_made: dict[str, int] = utils.DefaultDict(default=lambda x: 0) self.custom_url_parameters: dict[str, str] = {} def _log_total_requests(self) -> None: