当前位置: 首页 > 面试题库 >

Python:避免短路评估

常彭薄
2023-03-14
问题内容

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

在Django中,当您提交表单时,可以调用is_valid()相应的表单对象以触发验证并返回布尔值。因此,通常在视图函数中有类似的代码:

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语句中使用它们)。我想知道解决这类问题的Python方法。

提前致谢!


问题答案:

怎么样:

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)。



 类似资料:
  • 问题内容: 我有一个列表理解,近似为: 其中l是列表,而f(x)是返回列表的昂贵函数。 我想避免对f(x)的每个非空出现两次评估f(x)。有什么方法可以将其输出保存在列表推导中? 我可以删除最终条件,生成整个列表,然后修剪它,但这似乎很浪费。 编辑 : 建议了两种基本方法: 内部生成器理解: 或备忘录。 我认为内部生成器理解可以很好地解决上述问题。实际上,我简化了这个问题以使其清楚,我确实想要:

  • 问题内容: 我可以在MySQL 5.5的子句中使用任何短路逻辑运算符(特别是短路和短路)吗?如果没有,那还有什么选择? 在这个小提琴中可以找到关于我的问题的抽象观点以及对我为什么需要它的解释: http://sqlfiddle.com/#!2/97fd1/3 实际上,我们正在数百个国家/地区的数以千计的城市中的数百万家书店中查找数百万本图书,这就是为什么我们无法接受我们发送的每个查询都收到不必要信

  • 问题内容: 我想知道JavaScript是否具有C#中的&&运算符之类的“短路”评估。如果没有,我想知道是否有一种合理的解决方法可以采用。 问题答案: 是的,JavaScript具有“短路”评估。

  • 问题内容: 我正在尝试优化执行以下操作的查询: 该查询计划表明,即使在100%的行满足WHEN子句的情况下,也有相当多的时间花费在ELSE分支中对结果的调用上。 我能理解的唯一方法是假定SQLServer正在评估两个结果,然后仅基于对WHEN条件的评估来选择一个,但是我找不到关于CASE结果是否有任何确定的参考语句在条件语句之前进行评估。任何人都可以澄清或指向我参考吗? 问题答案: 那是实际的还是

  • 问题内容: 给出以下代码: 如果返回,php解释器是否还会检查以后的条件,例如? 如果是这样,那么为什么它在不需要时会做额外的工作呢? 问题答案: 是的,PHP解释器是“惰性”的,这意味着它将尽可能少地进行比较以评估条件。 如果要验证,请尝试以下操作:

  • 免责声明:我对反向工程字节码没有太多的经验,所以请不要对我太苛刻,如果这可以“轻松”回答我的问题。