Discord.py добавьте несколько значений с помощью цикла for в одно поле встраивания

#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. Спасибо, это было именно то, что я искал!