输入ndb.tasklets的注释

时间:2019-01-02 16:43:55

标签: python google-app-engine mypy

GvRs App Engine ndb Library以及monocle,而且-据我所知-现代Javascript使用Generators使异步代码看起来像阻塞代码。

事物用@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 get_result()函数以等待结果并获得它。例如:

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

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

  • get_google_async()-> ndb.Future(通过yield)
  • ndb.tasklet(get_google_async)-> ndb.Future
  • 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.Model。

1 个答案:

答案 0 :(得分:1)

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