#python #for-loop #discord.py
Вопрос:
В настоящее время я настраиваю музыкального бота с помощью Lavalink.
Для моей функции очереди я хочу использовать вложение с двумя полями: одно для текущей воспроизводимой дорожки и одно для дорожек, поставленных в очередь.
Использование цикла for для извлечения информации из объектов аудиотрека Lavalink:
embed.add_field(name="Currently playing",value=f"[{player.current.title}]({player.current.uri})")
for track in player.queue:
embed.add_field(name="Enqueued Tracks",value=f"[{track.title}]({track.uri})",inline=False)
Который добавляет новое поле каждый раз, когда трек добавляется в поставленные в очередь треки.
Есть ли способ добавить значения в определенное поле встраивания или мне нужно хранить объекты в списке, чтобы использовать их без использования цикла for.
Просто спрашиваю, какой здесь был бы самый эффективный и простой метод.
Ответ №1:
Все зависит от того, какова ваша цель — и я не был уверен в этом, когда писал свой ответ, так что потерпите меня. Если ваша цель состоит в том, чтобы создать новое поле встраивания для каждого трека, поставленного в очередь, по мере их поступления, сохраните ссылку на встраивание и просто используйте .add_field()
метод, как вы это делаете.
Тем не менее, если вы хотите иметь одно поле со списком дорожек, поставленных в очередь, вы можете попробовать такой генератор.
embed: discord.Embed = discord.Embed().add_field(
name="Currently Playing",
value=f"[{player.current.title}]({player.current.uri})"
)
embed.add_field(
name="Enqueued Tracks",
value='n'.join([f"[{track.title}]({track.uri})" for track in player.queue]),
inline=False
)
Что делает этот цикл в строке для , так это создает список строк, отформатированных как [title](url)
, соединяет их символами новой строки (по одному треку на строку) и вставляет их в значение поля. Вы можете ожидать, что это будет выглядеть примерно следующим образом, прежде чем присоединиться к символам новой строки.
["[title1](url1)", "[title2](url2)", "[title3](url3)"]
Если вы хотите обновить встраивание, вы можете сделать это двумя способами. Извлеките этот код в свой собственный метод и передавайте все треки, включая новый, в метод каждый раз, когда вам нужно его обновить (лучше всего, на мой взгляд), или, поскольку вы знаете, что это второе поле в встраивании, вы можете получить к нему доступ по адресу
embed.fields[1].value = "New Value"
Выбор за вами, удачи вам!
Комментарии:
1. Спасибо, это было именно то, что я искал!