Próbuję napisać botek niezgody i w komendzie przypomnienia, próbuję uzyskać skrypt do napisania funkcji przypomnienia do innego modułu, a następnie zaimportuj moduł i czeka na funkcję.

Jednak otrzymuję błąd:

Discord.ext.comMands.errors.comMandInvokeError: Polecenie podniesione wyjątek: atrybuteError: Moduł "Przypomnienia" nie ma atrybutu "A1"

Kiedy próbuję uruchomić skrypt - ale jeśli ręcznie wprowadzam funkcję do modułu, a następnie uruchom skrypt, nie ma problemu z za pomocą importowanej funkcji.

Kod:

async def rmcroutine(ctx, n, t):
    n = int(n)
    if "seconds" in t or "second" in t:
        desttime = str(datetime.now() + timedelta(seconds=n))[0:18]
        await ctx.send(f"Reminder for at {n} {t}(s) from now at {desttime}.")
        requestname = "a" + str(requestcounter)
        writein = open("reminders.py", "a")
        requestfnc = f"""
async def {requestname}(ctx):
    while True:
        currentime = str(datetime.now())[0:18]
        desttime = '{desttime}'
        if currentime == desttime:
            await ctx.send(f'Reminder for **{ctx.message.author.display_name}**, set {n} second(s) ago.')
            break
                
"""
        requestfnc = requestfnc.lstrip()
        writein.write(requestfnc)
        importlib.reload(reminders)
        await asyncio.sleep(15)
        callfunction = f"""reminders.{requestname}(ctx)"""
        await eval(callfunction)
1
Charlie Clark 22 lipiec 2020, 23:18

1 odpowiedź

Najlepsza odpowiedź

Co próbujesz zrobić, wydaje się niezwykle skomplikowane. Dlatego nie próbowałem zrozumieć, dlaczego dostajesz błąd, ponieważ powinieneś być w stanie napisać o wiele więcej po prostu:

async def rmcroutine(ctx, n, t):
    n = int(n)
    if "seconds" in t or "second" in t:
        desttime = str(datetime.now() + timedelta(seconds=n))[0:18]
        await ctx.send(f"Reminder for at {n} {t}(s) from now at {desttime}.")
 
        async def request(ctx):
            while True:
                currentime = str(datetime.now())[0:18]
                desttime = '{desttime}'
                if currentime == desttime:
                    await ctx.send(f'Reminder for **{ctx.message.author.display_name}**, set {n} second(s) ago.')
                    break
                
        await asyncio.sleep(15)
        await request(ctx)

Nowa funkcja request zostanie utworzona za każdym razem, gdy nazywa się rmcroutine, Nie musisz tworzyć unikalnej nazwy funkcji za pomocą licznika.

0
mkrieger1 22 lipiec 2020, 21:45