डिफ़ॉल्ट तर्क के रूप में 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एक दिया गया मान नहीं है, बस पहले पैरामीटर का नाम है। आप इस बारे में धारणा नहीं बना सकते हैं कि किस चीज का इस्तेमाल होने वाला है।

आप क्या कर सकते हैं, मानदंड की संख्या मान रहा है, उदाहरण के लिए, जो कि डिकार्डो प्रलेखन में है, आप इस तरह से कुछ कर सकते हैं:

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