Discord.py cách chuyển ctx làm đối số mặc định

Aug 15 2020

Tôi đang viết một lệnh hồ sơ bằng Discord.py để in ra thông tin về người dùng được chỉ định.

Tôi muốn chuyển tác giả thông báo làm đối số mặc định, vì vậy nếu người dùng chỉ viết lệnh và không có gì khác, bot sẽ gửi hồ sơ của họ.

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

Đoạn mã trên không hoạt động. Nó xảy ra với lỗi sau:

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

Ai có thể cho tôi biết tôi đang làm gì sai và làm thế nào để mã của tôi hoạt động?

BIÊN TẬP:

Tôi đã bỏ qua vấn đề với:

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

Câu hỏi của tôi vẫn còn, có cách nào để chuyển ctx làm đối số mặc định không?

Trả lời

1 fixmycode Aug 15 2020 at 16:39

Câu trả lời ngắn gọn là bạn không thể làm điều đó, vì bạn sẽ thay đổi chữ ký của hàm. Các lệnh được gọi là mong đợi chữ ký này:

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

ctxkhông phải là một giá trị nhất định, chỉ là tên của tham số đầu tiên. Bạn không thể đưa ra giả định về những gì sẽ được sử dụng.

Những gì bạn có thể làm, là giả sử số lượng tham số, theo ví dụ trong tài liệu discord.py, bạn có thể làm điều gì đó như sau:

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

Trong mã này, bạn có thể giả định memberluôn là Thành viên, ngoại trừ trong kênh riêng tư, khi đó sẽ là Người dùng.

2 Videro Aug 15 2020 at 16:37

bạn có thể sử dụng cái này -

user = ctx.author if not user else user

thay vì -

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