2 回答

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
該語(yǔ)言并不關(guān)心您返回哪個(gè)迭代器。該錯(cuò)誤來(lái)自asyncio庫(kù),該庫(kù)對(duì)迭代器必須生成的值類(lèi)型有特定的想法。Asyncio 需要__await__
生成 asyncio future(包括其子類(lèi)型,例如任務(wù))或None
.?其他庫(kù),如 curio 和 trio,將期望不同類(lèi)型的值??偟膩?lái)說(shuō),異步庫(kù)不會(huì)記錄他們的期望,__await__
因?yàn)樗麄冋J(rèn)為這是一個(gè)實(shí)現(xiàn)細(xì)節(jié)。
就 asyncio 而言,除了協(xié)程之外,您還應(yīng)該使用更高級(jí)別的構(gòu)造,例如 future 和任務(wù),并等待它們。很少需要__await__
手動(dòng)實(shí)現(xiàn),即使這樣,您也應(yīng)該使用它來(lái)委托另一個(gè)可等待的信號(hào)。編寫(xiě)一個(gè)__await__
創(chuàng)建并產(chǎn)生自己的新掛起值的方法需要將其與事件循環(huán)結(jié)合起來(lái)并了解其內(nèi)部結(jié)構(gòu)。
您可以將其視為__await__
編寫(xiě)類(lèi)似于 asyncio 的庫(kù)的工具。如果您是此類(lèi)庫(kù)的作者,則當(dāng)前規(guī)范就足夠了,因?yàn)槟梢詮牡髦猩扇魏文矚g的內(nèi)容,只有事件循環(huán)中的代碼才會(huì)觀察生成的值。如果您不處于這個(gè)位置,您可能不需要實(shí)施__await__
.

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
任務(wù)只能等待其他任務(wù)/未來(lái)。來(lái)自CPython 源代碼:
? ?/* Check if `result` is FutureObj or TaskObj (and not a subclass) */
? ? /* ... */
? ? /* Check if `result` is None */
? ? /* ... error */
? ? /* Check if `result` is a Future-compatible object */
? ? /* ... */
? ? /* Check if `result` is a generator */
? ? /* ... */
? ? /* The `result` is none of the above */
? ? o = task_set_error_soon(
? ? ? ? task, PyExc_RuntimeError, "Task got bad yield: %R", result);
? ? Py_DECREF(result);
? ? return o;
編輯:如果我理解正確的話,此限制僅施加于任務(wù),并且正常的 future 可以等待從 返回的任何可迭代對(duì)象__await__
,盡管重點(diǎn)可能是返回的可迭代對(duì)象產(chǎn)生事件循環(huán),然后最終返回結(jié)果。
添加回答
舉報(bào)