From f00a32511407085c6d6787548256f5260c2e5862 Mon Sep 17 00:00:00 2001 From: Alexander Schepanovski Date: Tue, 23 Jul 2019 15:46:24 +0700 Subject: [PATCH] dvc: refactor dict_md5() - stop using mutable default value - use list and dict comprehensions to speed it up and make nicer - employ exhaustive if..elif..else --- dvc/utils/__init__.py | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/dvc/utils/__init__.py b/dvc/utils/__init__.py index ed04b8ace..b7c98211f 100644 --- a/dvc/utils/__init__.py +++ b/dvc/utils/__init__.py @@ -88,32 +88,28 @@ def bytes_md5(byts): return hasher.hexdigest() -def dict_filter(d, exclude=[]): +def dict_filter(d, exclude=()): """ Exclude specified keys from a nested dict """ + def fix_key(k): + return str(k) if isinstance(k, builtin_str) else k + if isinstance(d, list): - ret = [] - for e in d: - ret.append(dict_filter(e, exclude)) - return ret + return [dict_filter(e, exclude) for e in d] + elif isinstance(d, dict): - ret = {} - for k, v in d.items(): - if isinstance(k, builtin_str): - k = str(k) + items = ((fix_key(k), v) for k, v in d.items()) + return { + k: dict_filter(v, exclude) for k, v in items if k not in exclude + } - assert isinstance(k, str) - if k in exclude: - continue - ret[k] = dict_filter(v, exclude) - return ret - - return d + else: + return d -def dict_md5(d, exclude=[]): +def dict_md5(d, exclude=()): filtered = dict_filter(d, exclude) byts = json.dumps(filtered, sort_keys=True).encode("utf-8") return bytes_md5(byts)