Python [syntaxe invalide] avec async def

j'essaie d'écrire des bots discord en utilisant Python, je suis tombé sur ce bot.

import discord
import asyncio
import random

client = discord.Client()
inEmail = input("Email:")
inPassword = input("Passwd:")

async def background_loop():
    await client.wait_until_ready()
    while not client.is_closed:
        channel = client.get_channel("************")
        messages = ["Hello!", "How are you doing?", "Testing!!"]
        await client.send_message(channel, random.choice(messages))
        await asyncio.sleep(120)

client.loop.create_task(background_loop())
client.run(inEmail, inPassword)

Pourtant, quand j'ai essayé, j'ai reçu un SyntaxError:

File "1.py", line 7
  async def background_loop():
     ^
SyntaxError: invalid syntax

Pourquoi est-ce? Je n'ai jamais reçu que avant quand je l'ai testé.

19
demandé sur abccd 2017-05-13 04:48:25

2 réponses

des requêtes asynchrones ont été introduites dans Python en v3.3, si vous utilisez Python avant v3.3 (y compris v2.X), vous devrez installer une nouvelle version de Python.


si vous utilisez Python 3.3: asyncio ne fait pas partie de la stdlib, vous aurez besoin de l'installer manuellement à partir de pypi:

pip install asyncio

async et await les mots-clés sont seulement valide pour Python 3.5 ou nouveaux. Si vous utilisez Python 3.3 ou 3.4, vous devrez apporter les modifications suivantes à votre code:

  1. @asyncio.coroutine décorateur au lieu de l' async déclaration:

async def func():
    pass

# replace to:

@asyncio.coroutine
def func():
    pass
  1. Utiliser yield from au lieu de await:

await coroutine() 

# replace to:

yield from coroutine()

Voici un exemple de ce que votre fonction doit changer (si vous êtes sur 3.3-3.4):

import asyncio

@asyncio.coroutine 
def background_loop():
    yield from client.wait_until_ready()
    while not client.is_closed:
        channel = client.get_channel("************")
        messages = ["Hello!", "How are you doing?", "Testing!!"]
        yield from client.send_message(channel, random.choice(messages))
        yield from asyncio.sleep(120)

la syntaxe susmentionnée est toujours supporté dans les versions plus récentes de Python 3, mais il est recommandé d'utiliser await et async s'il n'y a pas besoin de supporter Python 3.3-3.4. Vous pouvez vous référer à ce documentation, voici un court extrait:

async def le type de coroutine a été ajouté dans Python 3.5, et est recommandé s'il n'est pas nécessaire de prendre en charge les anciennes versions de Python.


à part:

supporte actuellement 3.4.2-3.6.6, (Il ne prend pas en charge 3.3-3.4.1, 3.7 en juillet 2018). Dans un futur proche, ils prévoient de porter la version Python minimum à 3.5.3.

28
répondu abccd 2018-07-09 00:42:25

de la version 3.7 asycn et wait sont des mots clés réservés

comme l'erreur dans l'image ci-dessous

enter image description here

copier le lien vers le nom du répertoire / dossier( ne pas inclure init.py) vous obtiendrez une liste de .py fichiers enter image description here

renommer le fichier async en _async ou asynch ou n'importe quoi d'autre comme async est maintenant un mot-clé réservé avec nous de la version 3.7

une fois renommé than ouvrez vérifier dans tous les fichiers où nous avons importation async modifier le nouveau nom à chaque où

et profiter

* NOTE bien que ce ne soit pas la solution permanente mais cela a fonctionné pour moi en cas de la même erreur de syntaxe en travaillant avec firebase la meilleure partie est d'aller dans l'ancienne version de python. I. version e ci-dessous 3.7

0
répondu Er M S Dandyan 2018-08-20 22:58:57