如何在discord.py中使用参数循环异步函数?

时间:2021-05-16 11:28:27

标签: python asynchronous discord.py asyncpraw

我有一个想要无限循环的异步函数。

@client.command()
async def cat(ctx):
    tempurl = "b"       
    subreddit = await reddit.subreddit("cats")
    allSubmissions = []

    new = subreddit.new(limit = 1)

    async for submission in new:
        allSubmissions.append(submission)

    randomSub = random.choice(allSubmissions)

    url = randomSub.url
    if tempurl != url:
        if url.endswith('.jpg') or url.endswith('.jpeg') or url.endswith('.png'):
            tempurl = url
            print("\n"+url)
            await ctx.send(url)

loop = asyncio.get_event_loop()
loop.run_until_complete(cat())
loop.close()

但是,使用 loop.run_until_complete(cat()) 给了我输出:

TypeError: cat() missing 1 required positional argument: 'ctx'

我试图寻找一种方法来循环带参数的异步函数,但找不到。


解决方案

我没有做我正在做的事情,而是使用 discord.ext.task(如 Łukasz Kwieciński 所建议的)创建了一个后台循环,然后从命令函数调用该后台循环函数。

感谢 Łukasz Kwieciński 再次帮助我

@tasks.loop(seconds=30)
async def catSend(ctx):
    tempurl = "bbbb"
    subreddit = await reddit.subreddit("cats")
    allSubmissions = []

    new = subreddit.new(limit = 1)
    async for submission in new:
        allSubmissions.append(submission)

    randomSub = random.choice(allSubmissions)

    url = randomSub.url
    if tempurl != url:
        if url.endswith('.jpg') or url.endswith('.jpeg') or url.endswith('.png'):
            tempurl = url
            print(url)
            await ctx.send(url)
        else:
            tempurl = url
        

@client.command()
async def cat(ctx):
    catSend.start(ctx)

1 个答案:

答案 0 :(得分:0)

我没有做我正在做的事情,而是使用了 discord.ext.task(根据 Łukasz Kwieciński 的建议)创建了一个后台循环,然后从命令函数中调用了该后台循环函数。

感谢 Łukasz Kwieciński 再次帮助我

tempurl = "bbbb"

@tasks.loop(seconds=30)
async def catSend(ctx):
    global tempurl
    subreddit = await reddit.subreddit("cats")
    allSubmissions = []

    new = subreddit.new(limit = 1)
    async for submission in new:
        allSubmissions.append(submission)

    randomSub = random.choice(allSubmissions)

    url = randomSub.url
    if tempurl != url:
        if url.endswith('.jpg') or url.endswith('.jpeg') or url.endswith('.png'):
            tempurl = url
            print(url)
            await ctx.send(url)
        else:
            tempurl = url
        

@client.command()
async def cat(ctx):
    catSend.start(ctx)