python - 如何防止短路评估?

标签 python logical-operators short-circuiting short-circuit-evaluation

这是我在处理 Django 项目时遇到的一个问题。这是关于表单验证的。

在 Django 中,当你有一个提交的表单时,你可以在相应的表单对象上调用 is_valid() 来触发验证并返回一个 bool 值。所以,通常你的 View 函数中有这样的代码:

if form.is_valid():
    # code to save the form data

is_valid() 不仅会验证表单数据,还会将错误消息添加到表单对象中,然后显示给用户。

在一个页面上,我同时使用了两个表单,并且还希望仅当两个表单都包含有效数据时才保存数据。这意味着在执行代码以保存数据之前,我必须在两个表单上调用 is_valid()。最明显的方式:

if form1.is_valid() and form2.is_valid():
    # ...

由于逻辑运算符的短路评估而无法工作。如果 form1 无效,则不会评估 form2 并且其错误消息将丢失。

这只是一个例子。据我所知,没有像其他语言(即 Smalltalk)那样的 and/or 的贪婪替代品。我可以想象在不同的​​情况下会出现这个问题(不仅在 Python 中)。我能想到的解决方案都是笨拙的(嵌套 ifs,将返回值分配给局部变量并在 if 语句中使用它们)。我想知道解决这类问题的pythonic方法。

最佳答案

比如:

if all([form1.is_valid(), form2.is_valid()]):
   ...

在一般情况下,可以使用列表理解,以便预先计算结果(与此上下文中常用的生成器表达式相反)。例如:

if all([ form.is_valid() for form in (form1,form2) ])  

这也可以很好地扩展到任意数量的条件......唯一的问题是它们都需要通过“and”而不是if foo and bar or baz: ....

(对于非短路 or,您可以使用 any 而不是 all)。

关于python - 如何防止短路评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12281469/

相关文章:

python - 如何设置某些 Tkinter 小部件的边框颜色?

c++ - 定义双感叹号?

sql-server - MSSQL 上标量 UDF 中的 NULL 参数

c++ - 是否强制要求短路逻辑运算符?和评价顺序?

c++ - C++中是否有 "normal"一元逻辑运算符

C++ 编译器优化和短路评估

python - 如何在 RealityKit 中指定双面 Material ?

Python:重复查找两个特殊字符之间的字符串

python - 如何在 python 中打印板?

mysql "and"结果集中的逻辑