Discord.py bagaimana melewatkan ctx sebagai argumen baku

Aug 15 2020

Saya menulis perintah profil menggunakan Discord.py yang mencetak informasi tentang pengguna tertentu.

Saya ingin meneruskan pembuat pesan sebagai argumen default, jadi jika pengguna hanya menulis perintah dan tidak ada yang lain, bot akan mengirim profil mereka.

@bot.command()
async def profile(ctx, *, user: discord.Member = ctx.message.author):

Kode di atas tidak berfungsi. Itu kesalahan dengan kesalahan berikut:

Traceback (most recent call last):
  File "bot.py", line 50, in <module>
    async def profile(ctx, *, user: discord.Member = ctx.message.author.name):
NameError: name 'ctx' is not defined

Adakah yang bisa memberi tahu saya apa yang saya lakukan salah dan bagaimana membuat kode saya berfungsi?

EDIT:

Saya semacam melewati masalah dengan:

@bot.command()
async def profile(ctx, *, user: discord.Member=None):
        if(user == None):
                user = ctx.message.author

Pertanyaan saya masih tersisa, apakah ada cara untuk meneruskan ctx sebagai argumen default?

Jawaban

1 fixmycode Aug 15 2020 at 16:39

Jawaban singkatnya adalah Anda tidak dapat melakukan itu, karena Anda akan mengubah tanda tangan dari fungsi tersebut. Perintah disebut mengharapkan tanda tangan ini:

async def my_command(ctx, *args, **kwargs):

ctxbukan nilai yang diberikan, hanya nama parameter pertama. Anda tidak bisa berasumsi tentang apa yang akan digunakan.

Yang dapat Anda lakukan adalah mengasumsikan jumlah parameter, mengikuti contoh yang ada di dokumentasi discord.py, Anda dapat melakukan sesuatu seperti ini:

async def profile(ctx, *, user:discord.Member):
    member = user or ctx.message.author

Dalam kode ini, Anda dapat menganggap memberselalu sebagai Anggota, kecuali di saluran pribadi, ketika itu akan menjadi Pengguna.

2 Videro Aug 15 2020 at 16:37

Anda dapat menggunakan ini -

user = ctx.author if not user else user

dari pada -

if(user == None):
                user = ctx.message.author