«Выполнить до завершения» l oop не заканчивается после завершения функции? - PullRequest
0 голосов
/ 28 апреля 2020

Я работал над ботом Discord, который извлекает информацию из API статистики Ubisoft Rainbow Six Siege. Я новичок в кодировании, и я знаю, что это немного сложно, но для получения статистики я использую некоторый пример кода, который я нашел в документации API :

    @types.coroutine
def run():
    auth = api.Auth("my_email", "my_password")
    player = yield from auth.get_player(username, api.Platforms.UPLAY)
    operator = yield from player.get_operator(oprtr)
    print(operator.kills)
    global result
    result = (operator.kills)

asyncio.get_event_loop().run_until_complete(run())

print (result)

Я разместил это внутри командной функции, которую я создал:

@client.command()
async def wins(ctx, username, oprtr):
    print (username, oprtr)

, которая вместе дает приведенный ниже код, который я аннотировал, чтобы показать, как l oop не заканчивается. Сам по себе (без нахождения внутри команды) @ types.coroutine работает нормально, только когда он находится внутри @ client.command (), l oop не заканчивается.

@client.command()
async def wins(ctx, username, oprtr):
    print (username, oprtr)

    @types.coroutine
    def run():
        auth = api.Auth("my_email", "my_password")
        player = yield from auth.get_player(username, api.Platforms.UPLAY)
        operator = yield from player.get_operator(oprtr)
        print(operator.kills)     #this value prints, so the function definitely works.
        global result
        result = (operator.kills)

    asyncio.get_event_loop().run_until_complete(run()) #this is the loop which seems to never end,
                                                       #and blocks anything from progressing

    print (result)           #these two outputs do not send, which tells me that everything is being
    await ctx.send("Hello")  #blocked by the loop

Как я уже сказал, я довольно новый и симпатичный кодировщик sh, так что я ценю любую помощь, это беспокоило меня весь день! Если вам нужна дополнительная информация, я сделаю все возможное, чтобы дать вам ее.

1 Ответ

0 голосов
/ 03 мая 2020

Вместо использования разорения до завершения l oop, возможно, попробуйте выполнить цикл, пока определенная переменная не станет истиной или ложью.

notdone = true
while notdone == true:
    #do whatever in here and when you want it to finish, just set notdone to false.
...