Python [Недопустимый синтаксис] с async def

Я пытаюсь писать разборчивые боты с помощью Python, я столкнулся и бросил вместе этого бота.

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)

Но когда я попытался запустить его, я получил SyntaxError:

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

Почему? Я никогда не получал этого раньше, когда тестировал его.

Ответ 1

Асинхронные запросы были введены в Python в версии 3.3, если вы используете Python до версии 3.3 (включая v2.X), вам придется установить более новую версию Python.


Только, если вы используете Python 3.3: asyncio не является частью stdlib, вам нужно будет установить его вручную из pypi:

pip install asyncio

Ключевые слова async и await действительны только для Python 3.5 или новее. Если вы используете Python 3.3 или 3.4, вам необходимо внести следующие изменения в код:

  1. Используйте декоратор @asyncio.coroutine вместо оператора async:

async def func():
    pass

# replace to:

@asyncio.coroutine
def func():
    pass
  1. Используйте yield from вместо await:

await coroutine() 

# replace to:

yield from coroutine()

Вот пример того, на что должна перейти ваша функция (если вы используете 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)

Вышеупомянутый синтаксис все еще поддерживается в более новых версиях Python 3, но рекомендуется использовать await и async, если нет необходимости поддерживать Python 3.3-3.4. Вы можете обратиться к этой документации, здесь приведен небольшой фрагмент:

Тип сопрограммы async def был добавлен в Python 3.5 и является рекомендуется, если нет необходимости поддерживать более старые версии Python.


Помимо:

в настоящее время поддерживает 3.4.2-3.6.6, (он не поддерживает 3.3-3.4.1, 3.7 по состоянию на январь 2019 года).

Для разработки с использованием discord.py я предлагаю использовать ветвь перезаписи discord.py:

поддерживает 3.5.3-3.7.

Ответ 2

Начиная с версии 3.7 async и await являются зарезервированными ключевыми словами.

как ошибка в изображении ниже.

enter image description here

Скопируйте и откройте путь (без __init__.py). Вы получите список файлов.py enter image description here

Переименуйте async.py в _async.py или как угодно, так как async теперь является зарезервированным ключевым словом для нас с версии 3.7.

После переименования измените новое имя везде.

* ПРИМЕЧАНИЕ Хотя это не постоянное решение, но оно работало для меня в случае той же синтаксической ошибки при работе с firebase. Лучшее решение - использовать предыдущую версию Python. то есть версия ниже 3.7.

Ответ 3

Я решил это, установив обновленный PyMC из github (они исправили ошибку, возникающую в Python 3.7):

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