首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ndb.tasklets类型注解

ndb.tasklets类型注解
EN

Stack Overflow用户
提问于 2019-01-02 16:43:55
回答 1查看 198关注 0票数 6

GvRs ndb库以及单片 --据我理解--现代Javascript使用生成器来使异步代码看起来像阻塞代码。

东西都是用@ndb.tasklet装饰的。当他们想将执行返回给runloop时,当他们准备好结果时,他们会yield (或者别名raise StopIteration(value) ):

代码语言:javascript
复制
@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 get_result()函数,以等待结果并得到它。例如:

代码语言:javascript
复制
def get_google():
    future = get_google_async()
    # do something else in real code here
    return future.get_result()

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

  • get_google_async() -> ndb.Future (通过产量)
  • ndb.tasklet(get_google_async) -> ndb.Future
  • ndb.tasklet(get_google_async).get_result() -> str

到目前为止,我只提出了异步函数的cast

代码语言:javascript
复制
def get_google():
    # type: () -> str
    future = get_google_async()
    # do something else in real code here
    return cast('str', future.get_result())

不幸的是,这不仅与urlfetch有关,而且涉及数百种方法--主要是ndb.Model。

EN

回答 1

Stack Overflow用户

发布于 2019-01-21 05:29:44

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

至于get_google,如果您不想进行强制转换,类型检查可能会奏效。

喜欢

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54010046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档