Python[sintaxis no válida] con definición asíncrona
syntax async-await (2)
A partir de la versión 3.7 async
y await
son palabras clave reservadas.
Me gusta el error en la imagen de abajo.
Copie y abra la ruta (sin __init__.py
). Obtendrá una lista de archivos .py
Cambie el nombre de async.py
a _async.py
o lo que desee, ya que async es ahora una palabra clave reservada para nosotros desde la versión 3.7.
Una vez cambiado el nombre, modifique el nuevo nombre en todas partes.
* NOTA Aunque no es una solución permanente, funcionó para mí en caso de que se produzca el mismo error de sintaxis al trabajar con firebase. La mejor solución es ir con la versión anterior de Python. Es decir, la versión de abajo 3.7.
Estoy intentando escribir bots de discordia usando Python, me he encontrado y junté este 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)
Sin embargo, cuando intenté ejecutarlo, recibí un SyntaxError
:
File "1.py", line 7
async def background_loop():
^
SyntaxError: invalid syntax
¿Porqué es eso? Nunca había recibido eso antes cuando lo probé.
Python introdujo solicitudes asíncronas en v3.3 , si está ejecutando Python antes de v3.3 (incluida v2.X), tendrá que instalar una versión más nueva de Python.
Solo si está ejecutando Python 3.3: asyncio
no es parte de stdlib, tendrá que instalarlo manualmente desde pypi :
pip install asyncio
Las palabras clave async
y await
solo son válidas para Python 3.5 o posterior . Si está utilizando Python 3.3 o 3.4, deberá realizar los siguientes cambios en su código:
- Use el decorador
@asyncio.coroutine
lugar de la declaraciónasync
:
async def func():
pass
# replace to:
@asyncio.coroutine
def func():
pass
- Utilice el
yield from
lugar deawait
:
await coroutine()
# replace to:
yield from coroutine()
Este es un ejemplo de lo que debe cambiar su función (si está en 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 sintaxis mencionada aún se admite en las versiones más nuevas de Python 3, pero se recomienda usar await
y async
si no hay necesidad de ser compatible con Python 3.3-3.4. Puede consultar esta documentation , aquí hay un breve fragmento de código:
El tipo de
async def
de coroutine se agregó en Python 3.5, y se recomienda si no hay necesidad de soportar versiones anteriores de Python.
Aparte:
discord.py actualmente admite 3.4.2-3.6.6, ( no admite 3.3-3.4.1, 3.7 a partir de julio de 2018 ). En un futuro cercano, planean aumentar la versión mínima de Python a 3.5.3.