龙卷风框架。 TypeError:“未来”对象不可调用

Posted

技术标签:

【中文标题】龙卷风框架。 TypeError:“未来”对象不可调用【英文标题】:Tornado framework. TypeError: 'Future' object is not callable 【发布时间】:2015-04-15 08:20:54 【问题描述】:

前段时间我开始学习 Tornado 框架。我遇到了缺乏经验的用户缺乏文档的问题,并且还检查了 asyncio 模块文档。 所以问题是,我在 asyncio 中有一些简单的代码:

    import asyncio

    @asyncio.coroutine
    def compute(x, y):
        print("Compute %s + %s ..." % (x, y))
        yield from asyncio.sleep(1.0)
        return x + y


    @asyncio.coroutine
    def print_sum(x, y):
        result = yield from compute(x, y)
        print("%s + %s = %s" % (x, y, result))


loop = asyncio.get_event_loop()
loop.run_until_complete(print_sum(1, 2))
loop.close()

然后我尝试使用 Tornado 框架做同样的事情:

from tornado.ioloop import IOLoop
from tornado import gen

@gen.coroutine
def compute(x, y):
   print("Compute %s + %s ..." % (x, y))
   yield gen.sleep(1.0)
   return (x+y)

@gen.coroutine
def print_sum(x, y):
   result = yield compute(x, y)
   print("%s + %s = %s" % (x, y, result))

IOLoop.instance().run_sync(print_sum(1,2))

但不幸的是 Tornado 代码引发了这样的异常:

 Compute 1 + 2 ...
Traceback (most recent call last):
  File "tornado_coroutine.py", line 19, in <module>
    IOLoop.instance().run_sync(print_sum(1, 2))
  File "C:\Python34\lib\site-packages\tornado\ioloop.py", line 421, in run_sync
    return future_cell[0].result()
  File "C:\Python34\lib\site-packages\tornado\concurrent.py", line 209, in resul
t
    raise_exc_info(self._exc_info)
  File "<string>", line 3, in raise_exc_info
  File "C:\Python34\lib\site-packages\tornado\ioloop.py", line 402, in run
    result = func()
TypeError: 'Future' object is not callable

也许 IOLoop 在所有协程都返回了它们的值之后尝试做一个新的“圈”?

【问题讨论】:

【参考方案1】:

run_sync 将函数(或其他“可调用”)作为参数。您正在就地调用该函数,然后将结果作为参数提供。你可以简单地使用lambda创建一个匿名函数:

IOLoop.instance().run_sync(lambda: print_sum(1,2))

【讨论】:

以上是关于龙卷风框架。 TypeError:“未来”对象不可调用的主要内容,如果未能解决你的问题,请参考以下文章

TypeError: 'NoneType' 对象不可迭代,使用带有 Selenium/Appium 的页面对象框架

TypeError:无法在 Django REST 框架中解压不可迭代的 int 对象

python 龙卷风使未来

TypeError: 'float' 类型的对象没有 len() & TypeError: 'float' 对象不可迭代

龙卷风发生器在列表中的任何未来恢复

pyspark:TypeError:'float'对象不可迭代