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()
这一切都很好。但是如何添加注释类型呢?正确的类型是:
到目前为止,我只想起了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。
答案 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