Python - 烧瓶 - 在默认浏览器中打开两个网页

问题描述:

以下代码是here给出的答案的变体。 两个webbrowser.open()被要求,他们在时间上稍微分开。Python - 烧瓶 - 在默认浏览器中打开两个网页

两个网页呈现正常,但都显示第二个(Chris)参数。

为什么Pat没有迎接?

import random, threading, webbrowser 
from flask import Flask, render_template_string 

app = Flask(__name__) 


@app.route('/<name>') 
def index(name): 
    return render_template_string('''<h3>Hello, {{ name }}!</h3>''', name=name) 


if __name__ == '__main__': 
    names = ['Pat', 'Chris'] 
    port = 5000 + random.randint(0, 999) 
    wait = 1.25 
    for name in names: 
     url = "http://127.0.0.1:{0}/{1}".format(port, name) 
     threading.Timer(wait, lambda: webbrowser.open(url)).start() 
     wait += 0.5 
    app.run(port=port, debug=False) 

在循环中定义回调函数是个问题,它叫做后期绑定。两个lambda最终都会看到url的最后一个值。与更换拉姆达:

functools.partial(webbrowser.open, url) 

或取消计时器,并在循环刚time.sleep(0.5)

+0

我明白了。谢谢。对于那些看到这个,然后无法在书中找到“后期装订”的人来说,在“关闭”下你可能会有更好的运气。 (我特指Beazley和Lutz的YMMV。) – Calaf