web-dev-qa-db-fra.com

Python [Syntaxe non valide] avec définition asynchrone

J'essaie d'écrire des bots de discorde en utilisant Python, j'ai croisé et jeté ensemble 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, lorsque j'ai essayé de l'exécuter, j'ai reçu un SyntaxError:

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

Pourquoi donc? Je n'ai jamais reçu cela auparavant lorsque je l'ai testé.

28
Andy

Les requêtes asynchrones ont été introduites dans Python dans la v3.3 , si vous exécutez Python avant la v3.3 (y compris la v2.X), vous aurez installer une version plus récente de Python.


uniquement si vous exécutez Python 3.3: asyncio ne fait pas partie de la bibliothèque stdlib, vous aurez besoin de l’installer manuellement à partir de Pypi :

pip install asyncio

Les mots-clés async et await ne sont valides que pour Python 3.5 ou plus récent . Si vous utilisez Python 3.3 ou 3.4, vous devrez apporter les modifications suivantes à votre code:

  1. Utilisez le décorateur @asyncio.coroutine À la place de l'instruction async:
async def func():
    pass

# replace to:

@asyncio.coroutine
def func():
    pass
  1. Utilisez 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 prise en charge dans les versions plus récentes de Python 3, mais il est recommandé d'utiliser await et async s'il n'est pas nécessaire de prendre en charge Python 3.3- 3.4. Vous pouvez vous référer à ceci documentation , voici un court extrait:

Le type de coroutine async def A été ajouté dans Python 3.5. Il est recommandé s'il n'est pas nécessaire de prendre en charge les anciennes versions Python.


De côté:

discord.py prend actuellement en charge 3.4.2-3.6.6, (. Il ne prend pas en charge les versions 3.3-3.4.1, 3.7 à partir de janvier 2019 ).

Pour développer avec discord.py, je suggère d'utiliser la branche discord.py rewrite:

discord.py-rewrite supporte 3.5.3-3.7.

39
abccd

A partir de la version 3.7, async et await sont des mots-clés réservés.

comme l'erreur dans l'image ci-dessous.

enter image description here

Copier et ouvrir le chemin (sans __init__.py). Vous obtiendrez une liste des fichiers .py enter image description here

Renommer async.py à _async.py ou tout ce que vous voulez, car async est maintenant un mot clé réservé chez nous à partir de la version 3.7.

Une fois renommé, modifiez le nouveau nom partout.

* NOTE Bien que ce ne soit pas une solution permanente, cela a fonctionné pour moi en cas d'erreur de syntaxe identique lors de l'utilisation de firebase. La meilleure solution consiste à utiliser la version précédente de Python. c'est-à-dire la version ci-dessous 3.7.

3
Er M S Dandyan

Je l'ai résolu en installant le PyMC mis à jour depuis github (ils ont corrigé le bogue qui se produit dans Python 3.7):

pip install git+https://github.com/pymc-devs/pymc.git

0
Marcelo Tournier