2 回答

TA貢獻1752條經驗 獲得超4個贊
該語言并不關心您返回哪個迭代器。該錯誤來自asyncio庫,該庫對迭代器必須生成的值類型有特定的想法。Asyncio 需要__await__
生成 asyncio future(包括其子類型,例如任務)或None
.?其他庫,如 curio 和 trio,將期望不同類型的值??偟膩碚f,異步庫不會記錄他們的期望,__await__
因為他們認為這是一個實現細節。
就 asyncio 而言,除了協程之外,您還應該使用更高級別的構造,例如 future 和任務,并等待它們。很少需要__await__
手動實現,即使這樣,您也應該使用它來委托另一個可等待的信號。編寫一個__await__
創建并產生自己的新掛起值的方法需要將其與事件循環結合起來并了解其內部結構。
您可以將其視為__await__
編寫類似于 asyncio 的庫的工具。如果您是此類庫的作者,則當前規范就足夠了,因為您可以從迭代器中生成任何您喜歡的內容,只有事件循環中的代碼才會觀察生成的值。如果您不處于這個位置,您可能不需要實施__await__
.

TA貢獻1795條經驗 獲得超7個贊
任務只能等待其他任務/未來。來自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;
編輯:如果我理解正確的話,此限制僅施加于任務,并且正常的 future 可以等待從 返回的任何可迭代對象__await__
,盡管重點可能是返回的可迭代對象產生事件循環,然后最終返回結果。
添加回答
舉報