web-dev-qa-db-ja.com

Python [無効な構文] with 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

何故ですか?私はそれをテストする前にそれを受け取ったことがありません。

28
Andy

v3.3でPythonに非同期要求が導入されました 、v3.3より前(v2.Xを含む)Pythonを実行している場合、新しいバージョンのPythonをインストールする必要があります。


のみ Python 3.3を実行している場合:asyncioはstdlibの一部ではありません pypiから手動でインストールする必要があります

pip install asyncio

asyncおよびawaitキーワードは、Python 3.5以降で有効のみです。 Python 3.3または3.4を使用している場合、コードに次の変更を加える必要があります。

  1. asyncステートメントの代わりに@asyncio.coroutineデコレーターを使用します。
async def func():
    pass

# replace to:

@asyncio.coroutine
def func():
    pass
  1. awaitの代わりにyield fromを使用します。
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の新しいバージョンでも引き続きサポートされますが、Pythonをサポートする必要がない場合はawaitおよびasyncを使用することをお勧めします3.3-3.4。あなたはこれを参照することができます documentation 、ここに短いスニペットがあります:

async defタイプのコルーチンはPython 3.5で追加され、古いPythonバージョンをサポートする必要がない場合に推奨されます。


余談:

discord.py は現在3.4.2-3.6.6をサポートしています(2019年1月の時点で3.3-3.4.1、3.7はサポートしていません)。

Discord.pyで開発するには、discord.py書き換えブランチを使用することをお勧めします。

discord.py-rewrite は3.5.3-3.7をサポートします。

39
abccd

バージョン3.7からasyncおよびawaitは予約済みキーワードです

下の画像のエラーのように。

enter image description here

パスをコピーして開きます(__init__.pyなし)。 .pyファイルのリストが表示されます enter image description here

非同期がバージョン3.7から予約キーワードになったため、async.py_async.pyまたは任意の名前に変更します。

名前を変更したら、新しい名前をどこでも変更します。

*注これは永続的な解決策ではありませんが、firebaseでの作業中に同じ構文エラーが発生した場合に機能しました。最善の解決策は、以前のバージョンのPythonを使用することです。すなわち3.7より下のバージョン

3
Er M S Dandyan

Githubから更新されたPyMCをインストールすることで解決しました(Python 3.7で発生するバグを修正しました):

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

0