如何在异步 Python 函数中指定 return 类型?

How to specify return type in an async Python function?

在 TypeScript 中,你会做类似的事情

async function getString(word: string): Promise<string> {
   return word;
}

如何在 Python 中执行相同的操作?我尝试了以下方法:

async def get_string(word: str) -> Coroutine[str]:
    return word

并得到了这个回溯:

TypeError: Too few parameters for typing.Coroutine; actual 1, expected 3

所以 Coroutine 需要 3 种类型。但为什么?在这种情况下它们应该是什么?

这个在the docs里也有说明,但是还是没看懂

示例 in the docs 显示了三种类型:

from typing import List, Coroutine
c = None # type: Coroutine[List[str], str, int]
...
x = c.send('hi') # type: List[str]
async def bar() -> None:
    x = await c # type: int
  1. 如果你发送了一个值,你会得到什么;
  2. 您可以发送什么价值;和
  3. 期待已久。

它还链接到 Generator definition,其中包含更多示例和更清晰的定义:

Generator[YieldType, SendType, ReturnType]

在你的情况下,我猜 [None, None, str],因为你只关心可等待的值。

您可以将其键入:

async def get_string(word: str) -> str:
    return word

并且隐含为 Coroutine[Any, Any, <return_type>]:

reveal_type(get_string)  # Revealed type is "def (word: builtins.str) -> typing.Coroutine[Any, Any, builtins.str]"

之所以Coroutine需要3个类型参数是因为它类似于一个Generator(其类型参数是yield、send和return类型),但是Python 相当于 TypeScript 的 Promise<T> 将是 Future[T].

即使问题比较老,我认为它仍然缺少一个明确的解释,因为打字稿开发人员可以mind-blowing 掌握这个概念。

async function getString(word: string): Promise<string> {
    return word;
}

与 python 中的打字稿不同,您通常不会显式地为协程编写 return 类型,通过使用 async 关键字可以隐式知道 return 类型将是协程

async def get_string(word: str) -> str:
    return word

长话短说:

async main():
    result = get_string() #result has inferred type of Coroutine[Any, Any, str]
    awaited_result = await get_string() #awaited_result has inferred type of str