From 7765580a140400cc55db93ed29d661b9542b3a74 Mon Sep 17 00:00:00 2001 From: Rapptz Date: Wed, 30 Dec 2015 13:00:52 -0500 Subject: [PATCH] utils.get now supports nested attribute retrieval. --- discord/utils.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/discord/utils.py b/discord/utils.py index 1629a4542..74c070c88 100644 --- a/discord/utils.py +++ b/discord/utils.py @@ -88,6 +88,9 @@ def get(iterable, **attrs): logical AND, not logical OR. Meaning they have to meet every attribute passed in and not one of them. + To have a nested attribute search (i.e. search by ``x.y``) then + pass in ``x__y`` as the keyword argument. + If nothing is found that matches the attributes passed, then ``None`` is returned. @@ -106,6 +109,12 @@ def get(iterable, **attrs): channel = discord.utils.get(server.channels, name='Foo', type=ChannelType.voice) + Nested attribute matching: + + .. code-block:: python + + channel = discord.utils.get(client.get_all_channels(), server__name='Cool', name='general') + Parameters ----------- iterable @@ -116,9 +125,12 @@ def get(iterable, **attrs): def predicate(elem): for attr, val in attrs.items(): - if not hasattr(elem, attr): - return False - if getattr(elem, attr) != val: + nested = attr.split('__') + obj = elem + for attribute in nested: + obj = getattr(obj, attribute) + + if obj != val: return False return True