运行asyncio代码时出现“期望协程,却得到None”错误求助
错误原因分析:"a coroutine was expected, got None"
核心问题
asyncio.create_task() 必须接收协程对象作为参数,但你的led.off()是普通同步函数(没有用async关键字修饰),调用它会直接返回None,这就触发了create_task的参数类型错误。
你看到LED关闭成功,是因为led.off()在调用时已经同步执行了关闭逻辑,但后续create_task因为传入了无效参数(None),还是会抛出异常。
解决方案
情况1:led.off()无需异步执行
直接同步调用即可,不需要用create_task和await:
try: led.off() # 直接执行同步逻辑 except Exception as ex: print(ex)
情况2:需要led.off()支持异步操作
修改LedNotification类中的off方法,添加async关键字将其改为协程函数:
class LedNotification: # ...其他已实现的方法... async def off(self): # 原有的LED关闭逻辑 pass
修改后,再用create_task和await调用就不会报错了。
额外说明
你之前调用的led.notify()是异步函数(带async修饰),调用后会返回协程对象,符合create_task的参数要求;但led.off()是普通函数,调用后返回None,这就是错误的根源。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

