Получить предмет с Python Bottle не работает - PullRequest
0 голосов
/ 21 мая 2018

При использовании:

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 не работает:

  • N остаетсявсегда в 0, для каждого нового запроса

  • print yielditem() дает <generator object yielditem at 0x0000000002D40EE8>

Как заставить это yield работатьобычно в этом контексте бутылочного Python?

Я ожидаю, что: 0 должно быть напечатано при первом запросе, 1 должно быть напечатано при втором запросе и т. д.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Это не имеет ничего отношения к бутылке, оно касается исключительно функции генератора.

Когда вы вызываете 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()
0 голосов
/ 21 мая 2018

Похоже, вы печатаете сам генератор, а не его значения:

from bottle import route, run, request, view

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

yf = yielditem()

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

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