使用'或'的Flask / python操作顺序

时间:2016-03-12 16:20:25

标签: python

我正在努力修改cookiecutter Flask应用。在其中我有以下功能,它正常工作:

@blueprint.route("/home/", methods=["GET", "POST"])
def home():
    form = LoginForm(request.form)
    # Handle logging in
    if request.method == 'POST':
        if form.validate_on_submit():
            login_user(form.user)
            flash("You are logged in.", 'success')
            redirect_url = request.args.get("next") or url_for("user.profile")
            return redirect(redirect_url)
        else:
            flash_errors(form)
    return render_extensions("public/home.html", form=form)

在行中:

redirect_url = request.args.get("next") or url_for("user.profile")

在命令行中:

>>> request.args.get('next')
>>> url_for("user.profile")
'/users/profile'
>>> redirect_url
'/users/profile'

这是一个基本问题,但我假设python同时评估request.args.get(" next")和url_for(" user.profile")和选择第一个不是'无'分配?

2 个答案:

答案 0 :(得分:2)

由于short-circuit evaluation,它只评估第二个表达式,如果第一个表达式在转换为bool时为False

您可以在每个表达式中添加print来自行验证:

def good():
    print 'good()'
    return True

def bad():
    print 'bad()'
    return False

然后

good() or bad()

输出:

good()

虽然

bad() or good()

输出:

bad()
good()

答案 1 :(得分:1)

Python或首先评估左边条件;如果它是“真实的”,则返回评估结果,否则返回评估正确条件的结果。

大多数值都是真实的,falsey值包括None,zero,空字符串,空列表或其他空容器。