對於Python中可被await物件的一點研究

2022-06-24 07:15:20 字數 1432 閱讀 5616

python3.5中新增加了關於async和await語法和定義了何為coroutines物件,在平時使用時,會分不清哪些能夠await,所以記錄下對於可被await的物件的理解.

根據pep 492,可被await的物件主要分為4類:

對於以上的4種物件,我將就自己的理解進行下列解釋,如有不同的意見歡迎指點.

在pep 492中,同時也定義了async語法,主要用於在函式定義時,使該函式變為乙個native coroutine

function,也就是在用到async定義的函式時,一樣能被await

async def func():

pass

async def main():

await func()

但是不僅僅使用types.coroutine裝飾器,函式必須使用yield from,並且後面返回乙個coroutine物件(即文中提到的除此之外的其他3種物件)

import types

import asyncio

from tornado.queues import queue

q = queue()

@types.coroutine

def run():

print("this is run")

yield from q.put(1)

async def main():

await run()

loop = asyncio.get_event_loop()

loop.run_until_complete(main())

顧名思義,就是定義了__await__方法的物件也能被await,同時該方法必須返回iterator,否則就會報錯

關於asyncio.future物件可被await,也是新增了__await__ = __iter__這一行

對於該類物件不是很好確定,通常可看原始碼來確定是否具有__await__方法

還未嘗試過編譯cpython,所以對於這點並不是特別清楚,但是文件中也說了和__await__方法類似,同樣要返回乙個iterator

補充延伸:

最初想要搞清楚可被await的物件是因為在學習tornado過程中,要不斷的使用async和await方法,為了在使用時能較清楚的明白使用條件,才去研究了await的使用條件.

而在tornado中,除了以上4點之外,我目前還了解能被await的物件或方法具有乙個特徵: 那就是他們都返回awaitable或future,比如說tornado.queues中的queue,在使用過程中,會發現queue中有的方法可以被await,有的方法並不可以,在檢視了原始碼之後,發現可被await的方法都是返回乙個future物件,而該物件是來自於asyncio的future,其中實現了__await__,所以才能被await.

參考文獻:

對於Python中 property的理解和使用

2017年09月02日 22 03 22 重看狗書,看到對user表定義的時候有下面兩行 property def password self raise attributeerror password is not a readable attribute password.setter def ...

對於Python中 property的理解和使用

property 這個我們在很多 中都會用到,簡單講即為乙個唯讀屬性的呼叫 如果需要有修改許可權,需要再加乙個 屬性名.setter 例 usr bin env python coding utf 8 property 示例class student object propertydef score...

對於Python中yield的理解

yield常見用法 該關鍵字用於函式中會把函式包裝為generator。然後可以對該generator進行迭代 for x in fun param 在乙個函式中,程式執行到yield語句的時候,程式暫停,返回yield後面表示式的值,在下一次呼叫的時候,從yield語句暫停的地方繼續執行,如此迴圈...