带有异步def的Python [无效语法] [英] Python [Invalid syntax] with async def
问题描述
我正在尝试使用Python编写不和谐的bot,我偶然发现了这个bot.
I am trying write discord bots using Python, I have come across and threw together this 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)
但是,当我尝试运行它时,却收到了SyntaxError
:
Yet when I tried to run it, I received a SyntaxError
:
File "1.py", line 7
async def background_loop():
^
SyntaxError: invalid syntax
那是为什么?我在测试它之前从未收到过它.
Why is that? I have never received that before when I tested it.
推荐答案
异步请求是在v3.3中引入了Python ,如果您运行的是v3.3之前的Python(包括v2.X),则必须安装更高版本的Python.
Asynchronous requests were introduced to Python in v3.3, if you're running Python prior to v3.3 (including v2.X), you'll have to install a newer version of Python.
仅(如果您正在运行Python 3.3):asyncio
不是stdlib的一部分,
Only if you are running Python 3.3: asyncio
is not part of the stdlib, you'll need to install it manually from pypi:
pip install asyncio
async
和await
关键字仅对 Python 3.5或更高版本有效.如果您使用的是Python 3.3或3.4,则需要对代码进行以下更改:
The async
and await
keywords are only valid for Python 3.5 or newer. If you're using Python 3.3 or 3.4, you will need to make the following changes to your code:
- 使用
@asyncio.coroutine
装饰器代替async
语句:
- Use the
@asyncio.coroutine
decorator instead of theasync
statement:
async def func():
pass
# replace to:
@asyncio.coroutine
def func():
pass
- 使用
yield from
代替await
:
await coroutine()
# replace to:
yield from coroutine()
以下是您的功能需要更改的示例(如果您使用的是3.3-3.4版本):
Here is an example of what your function need to change into (if you're on 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 3.3-3.4,则建议使用await
和async
.您可以参考此文档,下面是一个简短的代码段:>
The aforementioned syntax is still supported in newer versions of Python 3, but it is recommended to use await
and async
if there's no need to support for Python 3.3-3.4. You can refer back to this documentation, here's a short snippet:
协程的
async def
类型是在Python 3.5中添加的,它是 如果不需要支持较旧的Python版本,则建议使用.
The
async def
type of coroutine was added in Python 3.5, and is recommended if there is no need to support older Python versions.
在旁边:
discord.py 的问题支持3.4.2-3.6.6,(自2019年1月起不支持3.3-3.4.1,3.7 ).
Aside:
discord.py currently supports 3.4.2-3.6.6, (It does not support 3.3-3.4.1, 3.7 as of January 2019).
对于使用discord.py进行开发,我建议使用discord.py重写分支:
For developing with discord.py, I suggest using the discord.py rewrite branch:
discord.py-重写支持3.5.3-3.7.
discord.py-rewrite supports 3.5.3-3.7.
这篇关于带有异步def的Python [无效语法]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!