Skip to content

Commit a021450

Browse files
committed
♻️ refactor utils.get to utils.find across multiple files
1 parent 4afe54a commit a021450

File tree

14 files changed

+66
-77
lines changed

14 files changed

+66
-77
lines changed

CHANGELOG-V3.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ release.
2222
- `utils.time_snowflake` use `utils.generate_snowflake` instead
2323
- `utils.warn_deprecated`
2424
- `utils.deprecated`
25-
- `utils.get` use `utils.find` instead
25+
- `utils.get` use `utils.find` with `lambda i: i.attr == val`instead
26+
- `AsyncIterator.get` use `AsyncIterator.find` with `lambda i: i.attr == val` instead
2627
- `utils.as_chunks` use `itertools.batched` on Python 3.12+ or your own implementation
2728
instead

discord/bot.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
from .shard import AutoShardedClient
6464
from .types import interactions
6565
from .user import User
66-
from .utils import MISSING, find, get
66+
from .utils import MISSING, find
6767
from .utils.private import async_all
6868

6969
if TYPE_CHECKING:
@@ -358,7 +358,7 @@ def _check_command(cmd: ApplicationCommand, match: Mapping[str, Any]) -> bool:
358358

359359
# Now let's see if there are any commands on discord that we need to delete
360360
for cmd, value_ in registered_commands_dict.items():
361-
match = get(pending, name=registered_commands_dict[cmd]["name"])
361+
match = find(lambda c: c.name == registered_commands_dict[cmd]["name"], pending)
362362
if match is None:
363363
# We have this command registered but not in our list
364364
return_value.append(
@@ -516,8 +516,9 @@ def register(
516516
}
517517
)
518518
continue
519-
# We can assume the command item is a command, since it's only a string if action is delete
520-
match = get(pending, name=cmd["command"].name, type=cmd["command"].type)
519+
# We can assume the command item is a com
520+
# mand, since it's only a string if action is delete
521+
match = find(lambda c: c.name == cmd["command"].name and c.type == cmd["command"].type, pending)
521522
if match is None:
522523
continue
523524
if cmd["action"] == "edit":
@@ -606,10 +607,9 @@ def register(
606607
registered = await register("bulk", data, guild_id=guild_id)
607608

608609
for i in registered:
609-
cmd = get(
610+
cmd = find(
611+
lambda c: c.name == i["name"] and c.type == i.get("type"),
610612
self.pending_application_commands,
611-
name=i["name"],
612-
type=i.get("type"),
613613
)
614614
if not cmd:
615615
raise ValueError(f"Registered command {i['name']}, type {i.get('type')} not found in pending commands")
@@ -713,11 +713,9 @@ async def on_connect():
713713
registered_guild_commands[guild_id] = app_cmds
714714

715715
for i in registered_commands:
716-
cmd = get(
716+
cmd = find(
717+
lambda c: c.name == i["name"] and c.guild_ids is None and c.type == i.get("type"),
717718
self.pending_application_commands,
718-
name=i["name"],
719-
guild_ids=None,
720-
type=i.get("type"),
721719
)
722720
if cmd:
723721
cmd.id = i["id"]

discord/channel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,7 +1025,7 @@ def get_tag(self, id: int, /) -> ForumTag | None:
10251025
10261026
.. versionadded:: 2.3
10271027
"""
1028-
return utils.get(lambda t: t.id == id, self.available_tags)
1028+
return utils.find(lambda t: t.id == id, self.available_tags)
10291029

10301030
@overload
10311031
async def edit(
@@ -2491,7 +2491,7 @@ def instance(self) -> StageInstance | None:
24912491
24922492
.. versionadded:: 2.0
24932493
"""
2494-
return utils.get(self.guild.stage_instances, channel_id=self.id)
2494+
return utils.find(lambda s: s.channel_id == self.id, self.guild.stage_instances)
24952495

24962496
async def create_instance(
24972497
self,

discord/ext/bridge/core.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
SlashCommandOptionType,
4141
)
4242

43-
from ...utils import MISSING, find, get
43+
from ...utils import MISSING, find
4444
from ...utils.private import warn_deprecated
4545
from ..commands import (
4646
BadArgument,
@@ -621,7 +621,7 @@ async def convert(self, ctx, argument: str) -> Any:
621621

622622
if self.choices:
623623
choices_names: list[str | int | float] = [choice.name for choice in self.choices]
624-
if converted in choices_names and (choice := get(self.choices, name=converted)):
624+
if converted in choices_names and (choice := find(lambda c: c.name == converted, self.choices)):
625625
converted = choice.value
626626
else:
627627
choices = [choice.value for choice in self.choices]

discord/ext/commands/converter.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ def _get_from_guilds(bot, getter, argument):
8989
return result
9090

9191

92-
_utils_get = discord.utils.get
9392
T = TypeVar("T")
9493
T_co = TypeVar("T_co", covariant=True)
9594
CT = TypeVar("CT", bound=discord.abc.GuildChannel)
@@ -194,7 +193,7 @@ async def query_member_named(self, guild, argument):
194193
if len(argument) > 5 and argument[-5] == "#":
195194
username, _, discriminator = argument.rpartition("#")
196195
members = await guild.query_members(username, limit=100, cache=cache)
197-
return discord.utils.get(members, name=username, discriminator=discriminator)
196+
return discord.utils.find(lambda m: m.name == username and m.discriminator == discriminator, members)
198197
members = await guild.query_members(argument, limit=100, cache=cache)
199198
return discord.utils.find(
200199
lambda m: argument in (m.nick, m.name, m.global_name),
@@ -239,7 +238,7 @@ async def convert(self, ctx: Context, argument: str) -> discord.Member:
239238
if guild:
240239
result = guild.get_member(user_id)
241240
if ctx.message is not None and result is None:
242-
result = _utils_get(ctx.message.mentions, id=user_id)
241+
result = discord.utils.find(lambda e: e.id == user_id, ctx.message.mentions)
243242
else:
244243
result = _get_from_guilds(bot, "get_member", user_id)
245244

@@ -287,7 +286,7 @@ async def convert(self, ctx: Context, argument: str) -> discord.User:
287286
user_id = int(match.group(1))
288287
result = ctx.bot.get_user(user_id)
289288
if ctx.message is not None and result is None:
290-
result = _utils_get(ctx.message.mentions, id=user_id)
289+
result = discord.utils.find(lambda e: e.id == user_id, ctx.message.mentions)
291290
if result is None:
292291
try:
293292
result = await ctx.bot.fetch_user(user_id)
@@ -441,7 +440,7 @@ def _resolve_channel(ctx: Context, argument: str, attribute: str, type: type[CT]
441440
# not a mention
442441
if guild:
443442
iterable: Iterable[CT] = getattr(guild, attribute)
444-
result: CT | None = discord.utils.get(iterable, name=argument)
443+
result: CT | None = discord.utils.find(lambda e: e.name == argument, iterable)
445444
else:
446445

447446
def check(c):
@@ -470,7 +469,7 @@ def _resolve_thread(ctx: Context, argument: str, attribute: str, type: type[TT])
470469
# not a mention
471470
if guild:
472471
iterable: Iterable[TT] = getattr(guild, attribute)
473-
result: TT | None = discord.utils.get(iterable, name=argument)
472+
result: TT | None = discord.utils.find(lambda e: e.name == argument, iterable)
474473
else:
475474
thread_id = int(match.group(1))
476475
if guild:
@@ -709,7 +708,7 @@ async def convert(self, ctx: Context, argument: str) -> discord.Role:
709708
if match:
710709
result = guild.get_role(int(match.group(1)))
711710
else:
712-
result = discord.utils.get(guild._roles.values(), name=argument)
711+
result = discord.utils.find(lambda e: e.name == argument, guild._roles.values())
713712

714713
if result is None:
715714
raise RoleNotFound(argument)
@@ -760,7 +759,7 @@ async def convert(self, ctx: Context, argument: str) -> discord.Guild:
760759
result = ctx.bot.get_guild(guild_id)
761760

762761
if result is None:
763-
result = discord.utils.get(ctx.bot.guilds, name=argument)
762+
result = discord.utils.find(lambda e: e.name == argument, ctx.bot.guilds)
764763

765764
if result is None:
766765
raise GuildNotFound(argument)
@@ -792,10 +791,10 @@ async def convert(self, ctx: Context, argument: str) -> discord.GuildEmoji:
792791
if match is None:
793792
# Try to get the emoji by name. Try local guild first.
794793
if guild:
795-
result = discord.utils.get(guild.emojis, name=argument)
794+
result = discord.utils.find(lambda e: e.name == argument, guild.emojis)
796795

797796
if result is None:
798-
result = discord.utils.get(bot.emojis, name=argument)
797+
result = discord.utils.find(lambda e: e.name == argument, bot.emojis)
799798
else:
800799
emoji_id = int(match.group(1))
801800

@@ -858,10 +857,10 @@ async def convert(self, ctx: Context, argument: str) -> discord.GuildSticker:
858857
if match is None:
859858
# Try to get the sticker by name. Try local guild first.
860859
if guild:
861-
result = discord.utils.get(guild.stickers, name=argument)
860+
result = discord.utils.find(lambda s: s.name == argument, guild.stickers, name=argument)
862861

863862
if result is None:
864-
result = discord.utils.get(bot.stickers, name=argument)
863+
result = discord.utils.find(lambda s: s.name == argument, bot.stickers)
865864
else:
866865
sticker_id = int(match.group(1))
867866

@@ -913,17 +912,23 @@ async def convert(self, ctx: Context, argument: str) -> str:
913912
if ctx.guild:
914913

915914
def resolve_member(id: int) -> str:
916-
m = (None if msg is None else _utils_get(msg.mentions, id=id)) or ctx.guild.get_member(id)
915+
m = (
916+
None if msg is None else discord.utils.find(lambda e: e.id == id, msg.mentions)
917+
) or ctx.guild.get_member(id)
917918
return f"@{m.display_name if self.use_nicknames else m.name}" if m else "@deleted-user"
918919

919920
def resolve_role(id: int) -> str:
920-
r = (None if msg is None else _utils_get(msg.mentions, id=id)) or ctx.guild.get_role(id)
921+
r = (
922+
None if msg is None else discord.utils.find(lambda e: e.id == id, msg.mentions)
923+
) or ctx.guild.get_role(id)
921924
return f"@{r.name}" if r else "@deleted-role"
922925

923926
else:
924927

925928
def resolve_member(id: int) -> str:
926-
m = (None if msg is None else _utils_get(msg.mentions, id=id)) or ctx.bot.get_user(id)
929+
m = (
930+
None if msg is None else discord.utils.find(lambda e: e.id == id, msg.mentions)
931+
) or ctx.bot.get_user(id)
927932
return f"@{m.name}" if m else "@deleted-user"
928933

929934
def resolve_role(id: int) -> str:

discord/ext/commands/core.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1866,9 +1866,9 @@ def predicate(ctx: Context) -> bool:
18661866

18671867
# ctx.guild is None doesn't narrow ctx.author to Member
18681868
if isinstance(item, int):
1869-
role = discord.utils.get(ctx.author.roles, id=item) # type: ignore
1869+
role = discord.utils.find(lambda r: r.id == item, ctx.author.roles) # type: ignore
18701870
else:
1871-
role = discord.utils.get(ctx.author.roles, name=item) # type: ignore
1871+
role = discord.utils.find(lambda r: r.name == item, ctx.author.roles) # type: ignore
18721872
if role is None:
18731873
raise MissingRole(item)
18741874
return True
@@ -1913,9 +1913,14 @@ def predicate(ctx):
19131913
raise NoPrivateMessage()
19141914

19151915
# ctx.guild is None doesn't narrow ctx.author to Member
1916-
getter = functools.partial(discord.utils.get, ctx.author.roles) # type: ignore
1916+
getter = functools.partial(discord.utils.find, seq=ctx.author.roles) # type: ignore
19171917
if any(
1918-
(getter(id=item) is not None if isinstance(item, int) else getter(name=item) is not None) for item in items
1918+
(
1919+
getter(lambda e: e.id == item) is not None
1920+
if isinstance(item, int)
1921+
else getter(lambda e: e.name == item) is not None
1922+
)
1923+
for item in items
19191924
):
19201925
return True
19211926
raise MissingAnyRole(list(items))
@@ -1943,9 +1948,9 @@ def predicate(ctx):
19431948

19441949
me = ctx.me
19451950
if isinstance(item, int):
1946-
role = discord.utils.get(me.roles, id=item)
1951+
role = discord.utils.find(lambda r: r.id == item, me.roles)
19471952
else:
1948-
role = discord.utils.get(me.roles, name=item)
1953+
role = discord.utils.find(lambda r: r.name == item, me.roles)
19491954
if role is None:
19501955
raise BotMissingRole(item)
19511956
return True
@@ -1972,9 +1977,14 @@ def predicate(ctx):
19721977
raise NoPrivateMessage()
19731978

19741979
me = ctx.me
1975-
getter = functools.partial(discord.utils.get, me.roles)
1980+
getter = functools.partial(discord.utils.find, seq=me.roles)
19761981
if any(
1977-
(getter(id=item) is not None if isinstance(item, int) else getter(name=item) is not None) for item in items
1982+
(
1983+
getter(lambda e: e.id == item) is not None
1984+
if isinstance(item, int)
1985+
else getter(lambda e: e.name == item) is not None
1986+
)
1987+
for item in items
19781988
):
19791989
return True
19801990
raise BotMissingAnyRole(list(items))

discord/guild.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1020,7 +1020,7 @@ def get_member_named(self, name: str, /) -> Member | None:
10201020

10211021
# do the actual lookup and return if found
10221022
# if it isn't found then we'll do a full name lookup below.
1023-
result = utils.get(members, name=name[:-5], discriminator=potential_discriminator)
1023+
result = utils.find(lambda m: m.name == name[:-5] and discriminator == potential_discriminator, members)
10241024
if result is not None:
10251025
return result
10261026

discord/iterators.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,6 @@ class _AsyncIterator(AsyncIterator[T]):
8585
async def next(self) -> T:
8686
raise NotImplementedError
8787

88-
def get(self, **attrs: Any) -> Awaitable[T | None]:
89-
def predicate(elem: T):
90-
for attr, val in attrs.items():
91-
nested = attr.split("__")
92-
obj = elem
93-
for attribute in nested:
94-
obj = getattr(obj, attribute)
95-
96-
if obj != val:
97-
return False
98-
return True
99-
100-
return self.find(predicate)
101-
10288
async def find(self, predicate: _Func[T, bool]) -> T | None:
10389
while True:
10490
try:

discord/poll.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def count(self) -> int | None:
144144
return None
145145
if self._poll.results is None:
146146
return None # Unknown vote count.
147-
_count = self._poll.results and utils.get(self._poll.results.answer_counts, id=self.id)
147+
_count = self._poll.results and utils.find(lambda p: p.id == id, self._poll.results.answer_counts)
148148
if _count:
149149
return _count.count
150150
return 0 # If an answer isn't in answer_counts, it has 0 votes.
@@ -426,7 +426,7 @@ def get_answer(self, id) -> PollAnswer | None:
426426
Optional[:class:`.PollAnswer`]
427427
The returned answer or ``None`` if not found.
428428
"""
429-
return utils.get(self.answers, id=id)
429+
return utils.find(lambda a: a.id == id, self.answers)
430430

431431
def add_answer(
432432
self,

discord/team.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def icon(self) -> Asset | None:
8585
@property
8686
def owner(self) -> TeamMember | None:
8787
"""The team's owner."""
88-
return utils.get(self.members, id=self.owner_id)
88+
return utils.find(lambda m: m.id == self.owner_id, self.members)
8989

9090

9191
class TeamMember(BaseUser):

0 commit comments

Comments
 (0)