首页 > 解决方案 > 使用 Python Bottle 生成物品不起作用

问题描述

使用时:

from bottle import route, run, request, view

N = 0

def yielditem():
    global N
    for i in range(100):
        N = i
        yield i

@route('/')
@view('index.html')
def index():
    print yielditem()
    print N    

run(host='localhost', port=80, debug=False)

页面index.html显示成功,但yield部分不工作:

如何yield在这个 Bottle Python 上下文中正常工作?

我期望的是:0应该在第一个请求时1打印,应该在第二个请求时打印,等等。

标签: pythoniteratorgeneratorpython-2.xyield

解决方案


这与 Bottle 没有任何关系,仅与生成器功能有关。

当你调用 时,你会得到一个生成器对象yielditem(),正如 Python 告诉你的那样。它不会神奇地开始迭代它。 yielditem

如果您确实想遍历生成器对象,则必须明确地执行此操作,例如print(next(yielditem())).

你想如何使用那个生成器是另一回事:如果你想在多个函数调用期间访问同一个生成器对象,你可以把它放在被调用的函数之外:

generator_object = yielditem()

def print_it():  # this is like your `index` function
    print "Current value: {}".format(next(generator_object))

for x in range(10):  # this is like a client reloading the page
    print_it()

推荐阅读