From e9532d1235c70529ffe9a436d41a655900864873 Mon Sep 17 00:00:00 2001 From: Zevaryx Date: Wed, 2 Feb 2022 19:44:27 -0700 Subject: [PATCH] Add jarvis.utils.get --- jarvis/utils/__init__.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/jarvis/utils/__init__.py b/jarvis/utils/__init__.py index d93ba9b..1bd4fbe 100644 --- a/jarvis/utils/__init__.py +++ b/jarvis/utils/__init__.py @@ -1,5 +1,6 @@ """J.A.R.V.I.S. Utility Functions.""" from datetime import datetime +from operator import attrgetter from pkgutil import iter_modules from typing import Any, Callable, Iterable, Optional, TypeVar @@ -109,3 +110,20 @@ def find(predicate: Callable[[T], Any], seq: Iterable[T]) -> Optional[T]: if predicate(element): return element return None + + +def get(iterable: Iterable[T], **attrs: Any) -> Optional[T]: + if len(attrs) == 1: + k, v = attrs.popitem() + pred = attrgetter(k.replace("__", ".")) + for elem in iterable: + if pred(elem) == v: + return elem + return None + + converted = [(attrgetter(attr.replace("__", ".")), value) for attr, value in attrs.items()] + + for elem in iterable: + if all(pred(elem) == value for pred, value in converted): + return elem + return None