代码之家  ›  专栏  ›  技术社区  ›  max

类型注释ndb.tasklets

  •  6
  • max  · 技术社区  · 6 年前

    ndb Library 以及 monocle 据我所知,现代Javascript使用生成器使异步代码看起来像块代码。

    东西是用 @ndb.tasklet . 他们 yield 当他们想让运行循环返回执行,当他们准备好结果时 raise StopIteration(value) ndb.Return ):

    @ndb.tasklet
    def get_google_async():
        context = ndb.get_context()
        result = yield context.urlfetch("http://www.google.com/")
        if result.status_code == 200:
            raise ndb.Return(result.content)
        raise RuntimeError
    

    要使用这样的函数,您将得到一个 ndb.Future get_result() 函数来等待结果并得到它。例如。:

    def get_google():
        future = get_google_async()
        # do something else in real code here
        return future.get_result()
    

    这一切都很好。但是如何添加类型注释呢?正确的类型是:

    • 获取\u google\u async()->ndb.未来(通过产量)
    • ndb.tasklet(获取谷歌异步)->gt;ndb.未来
    • ndb.tasklet(get_google_async).get_result()->str

    到目前为止,我只想到 cast 异步函数。

    def get_google():
        # type: () -> str
        future = get_google_async()
        # do something else in real code here
        return cast('str', future.get_result())
    

    不幸的是这不仅仅是 urlfetch 但是大约有几百种方法-主要是ndb.型号.

    1 回复  |  直到 6 年前
        1
  •  1
  •   taka    6 年前

    get_google_async 它本身是一个生成器函数,因此类型提示可以是 () -> Generator[ndb.Future, None, None] ,我想。

    至于 get_google ,如果不想强制转换,则类型检查可能会起作用。

    喜欢

    def get_google():
        # type: () -> Optional[str]
        future = get_google_async()
        # do something else in real code here
        res = future.get_result()
        if isinstance(res, str):
            return res
        # somehow convert res to str, or
        return None