webentwicklung-frage-antwort-db.com.de

Python [Ungültige Syntax] mit asynchroner Def

Ich versuche mit Python Zwietracht-Bots zu schreiben. Ich bin auf diesen Bot gestoßen und habe ihn zusammengeschmissen.

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)

Als ich jedoch versuchte, es auszuführen, erhielt ich ein SyntaxError:

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

Warum das? Ich habe das noch nie erhalten, als ich es getestet habe.

28
Andy

In Version 3.3 wurden asynchrone Anforderungen an Python eingeführt Wenn Sie Python vor Version 3.3 (einschließlich Version 2.X) ausführen, müssen Sie dies tun um eine neuere Version von Python zu installieren.


Nur , wenn Sie Python 3.3 ausführen: asyncio ist nicht Teil der stdlib, Sie werden müssen es manuell von pypi installieren :

pip install asyncio

Die Schlüsselwörter async und await sind nur für Python 3.5 oder höher gültig. Wenn Sie Python 3.3 oder 3.4 verwenden, müssen Sie die folgenden Änderungen an Ihrem Code vornehmen:

  1. Verwenden Sie den Dekorator @asyncio.coroutine Anstelle der Anweisung async:
async def func():
    pass

# replace to:

@asyncio.coroutine
def func():
    pass
  1. Verwenden Sie yield from Anstelle von await:
await coroutine() 

# replace to:

yield from coroutine()

Hier ist ein Beispiel, wie sich Ihre Funktion ändern muss (wenn Sie mit 3.3-3.4 arbeiten):

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)

Die oben genannte Syntax wird in neueren Versionen von Python 3 weiterhin unterstützt. Es wird jedoch empfohlen, await und async zu verwenden, wenn Python 3.3 nicht unterstützt werden muss. 3.4. Sie können auf diese Dokumentation zurückgreifen , hier ist ein kurzer Ausschnitt:

Der Coroutine-Typ async def Wurde in Python 3.5 hinzugefügt und wird empfohlen, wenn ältere Versionen Python nicht unterstützt werden müssen.


Beiseite:

discord.py unterstützt derzeit 3.4.2-3.6.6, ( Unterstützt 3.3-3.4.1, 3.7 ab Januar 2019 nicht ).

Für die Entwicklung mit discord.py empfehle ich die Verwendung des Rewrite-Zweigs discord.py:

discord.py-rewrite unterstützt 3.5.3-3.7.

39
abccd

Ab Version 3.7 sind async und await reservierte Schlüsselwörter

wie der Fehler im Bild unten.

enter image description here

Kopieren Sie den Pfad und öffnen Sie ihn (ohne __init__.py). Sie erhalten eine Liste der .py-Dateien enter image description here

Benennen Sie async.py In _async.py Um, oder was immer Sie möchten, da Async ab Version 3.7 ein reserviertes Schlüsselwort für uns ist.

Ändern Sie nach dem Umbenennen den neuen Namen überall.

* HINWEIS Es ist zwar keine dauerhafte Lösung, hat aber bei mir funktioniert, wenn beim Arbeiten mit Firebase derselbe Syntaxfehler aufgetreten ist. Die beste Lösung ist, mit einer früheren Version von Python zu arbeiten. d.h. Version unter 3.7.

3
Er M S Dandyan

Ich habe es gelöst, indem ich den aktualisierten PyMC von github installiert habe (sie haben den Fehler behoben, der in Python 3.7) auftritt):

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

0