Discord.py วิธีส่ง ctx เป็นอาร์กิวเมนต์เริ่มต้น

Aug 15 2020

ฉันกำลังเขียนคำสั่งโปรไฟล์โดยใช้ Discord.py ซึ่งพิมพ์ข้อมูลเกี่ยวกับผู้ใช้ที่ระบุ

ฉันต้องการส่งผู้เขียนข้อความเป็นอาร์กิวเมนต์เริ่มต้นดังนั้นหากผู้ใช้เพียงแค่เขียนคำสั่งและไม่มีอะไรอื่นบอทจะส่งโปรไฟล์ของพวกเขา

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

โค้ดด้านบนใช้ไม่ได้ เกิดข้อผิดพลาดโดยมีข้อผิดพลาดต่อไปนี้:

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

ใครช่วยบอกทีว่าฉันทำอะไรผิดและจะทำให้โค้ดของฉันทำงานได้อย่างไร

แก้ไข:

ฉันหลีกเลี่ยงปัญหาด้วย:

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

คำถามของฉันยังคงมีอยู่มีวิธีใดบ้างที่จะส่ง ctx เป็นอาร์กิวเมนต์เริ่มต้น

คำตอบ

1 fixmycode Aug 15 2020 at 16:39

คำตอบสั้น ๆ คือคุณไม่สามารถทำเช่นนั้นได้เนื่องจากคุณกำลังแก้ไขลายเซ็นของฟังก์ชัน คำสั่งเรียกว่าคาดหวังลายเซ็นนี้:

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

ctxไม่ใช่ค่าที่กำหนดเป็นเพียงชื่อของพารามิเตอร์ตัวแรก คุณไม่สามารถตั้งสมมติฐานเกี่ยวกับสิ่งที่จะนำไปใช้

สิ่งที่คุณทำได้คือสมมติว่าเป็นจำนวนพารามิเตอร์ตามตัวอย่างที่อยู่ในเอกสาร discord.py คุณสามารถทำสิ่งนี้ได้:

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

ในรหัสนี้คุณสามารถสมมติว่าmemberเป็นสมาชิกเสมอยกเว้นในช่องส่วนตัวเมื่อเป็นผู้ใช้

2 Videro Aug 15 2020 at 16:37

คุณสามารถใช้สิ่งนี้ -

user = ctx.author if not user else user

แทน -

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