From 4d9e4b5f20d2f2d4388d24d89bea694185ead623 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 13 May 2023 07:39:09 -0500 Subject: [PATCH 1/2] chore: Improve merge_dict typing --- src/unihan_etl/util.py | 52 +++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/unihan_etl/util.py b/src/unihan_etl/util.py index 7e2e9fd2..2f6f8dce 100644 --- a/src/unihan_etl/util.py +++ b/src/unihan_etl/util.py @@ -7,6 +7,7 @@ import re import sys import typing as t +from collections.abc import Mapping def ucn_to_unicode(ucn: str) -> str: @@ -93,31 +94,34 @@ def format_size(_bytes: int) -> str: print("\n") -_T = t.TypeVar("_T") +T = t.TypeVar("T", bound="Mapping[str, t.Any]") def merge_dict( - base: t.Mapping[str, _T], additional: t.Mapping[str, _T] -) -> t.Dict[str, _T]: - if base is None: - return additional - - if additional is None: - return base - - if not (isinstance(base, t.Mapping) and isinstance(additional, t.Mapping)): - return additional - - merged = base - assert isinstance(merged, dict) - - for key, value in additional.items(): - if isinstance(value, t.Mapping): - assert isinstance(key, str) - assert isinstance(value, dict) - merged.setdefault(key, {}) - merged[key] = merge_dict(merged[key], value) + d: T, + u: T, +) -> T: + """Return updated dict. + + Parameters + ---------- + d : dict + u : dict + + Returns + ------- + dict : + Updated dictionary + + Notes + ----- + Thanks: http://stackoverflow.com/a/3233356 + """ + for k, v in u.items(): + assert isinstance(d, dict) + if isinstance(v, dict): + r = merge_dict(d.get(k, {}), v) + d[k] = r else: - merged[key] = value - - return merged + d[k] = u[k] + return d From 517673a14f29d698020197b1c82428c6347963d0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 13 May 2023 07:40:30 -0500 Subject: [PATCH 2/2] docs(CHANGES): Note typing updates --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 99db68dc..ff67244a 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,10 @@ $ pipx install --suffix=@next unihan-etl --pip-args '\--pre' --force - _Insert changes/features/fixes for next release here_ +### Development + +- `merge_dict`: Improve typing of generic params (#271) + ## unihan-etl 0.18.1 (2022-10-01) ### Packaging