【发布时间】:2015-09-02 15:16:53
【问题描述】:
我正在 python 3.4.3 中研究龙卷风和电机。
我有三个文件。让我们将其命名为main.py、model.py、core.py
我有三个函数,每个函数一个......
main.py
def getLoggedIn(request_handler):
# request_handler = tornado.web.RequestHandler()
db = request_handler.settings["db"]
uid = request_handler.get_secure_cookie("uid")
result = model.Session.get(db, uid=uid)
return result.get("_id", None) if result else None
model.py
@classmethod
def get(cls, db, user_id=None, **kwargs):
session = core.Session(db)
return session.get(user_id, **kwargs)
core.py
@gen.coroutine
def get(self, user_id, **kwargs):
params = kwargs
if user_id:
params.update({"_id": ObjectId(user_id)}) #This does not exist in DB
future = self.collection.find_one(params)
print(future) #prints <tornado.concurrent.Future object at 0x04152A90>
result = yield future
print(result) #prints None
return result
调用看起来像getLoggedIn => model.get => core.get
core.get 用@gen.coroutine 装饰,我调用yield self.collection.find_one(params)
print(result) 打印 None 但如果我返回结果并尝试在 getLoggedIn 函数中打印返回值,它会打印。
我相信这与龙卷风的异步性质有关,打印在 yield 之前被调用,但我不确定。如果有人可以解释协程/生成器在不同可能情况下的原理和行为,那将是一个很大的帮助。
【问题讨论】:
-
print(future)是做什么的? -
我删除了我之前的评论,因为我现在看到这是你问题的一部分。你希望
result = yield future做什么?我认为这将是一个语法错误。这并不让我感到惊讶;它给None一点也不让我吃惊。yield的使用与return大致相似,但设置了一个生成器并保存了函数状态。 -
print(future) 打印 Future 对象并且 print(result) 打印 None
-
我希望结果是一个生成器对象,而不是未来。
core.get()返回的result在我打印时被model.get()作为 Future 对象接收。
标签: python tornado tornado-motor