How to prevent short-circuit evaluation?(如何防止评估短路?)
本文介绍了如何防止评估短路?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是我在处理Django项目时遇到的问题。这与表单验证有关。
在Django中,当您有一个提交的表单时,您可以在相应的Form对象上调用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中)。我能想到的解决方案都有些笨拙(嵌套的if
,将返回值赋给局部变量并在if
语句中使用它们)。我想知道解决这类问题的方法。
推荐答案
不如这样:
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
)。
这篇关于如何防止评估短路?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何防止评估短路?
基础教程推荐
猜你喜欢
- 使用工作区API导入方法导入数据库笔记本(动态内 2022-09-21
- 在 pandas 中使用带有多重索引的.loc 2022-09-22
- Python h5py-为什么我收到广播错误? 2022-09-21
- 获取多索引中某个级别的最后一个元素 2022-09-22
- 在OpenCV中放大后,Python会捕捉图像的特定部分 2022-09-22
- 如何防止Groupby超越指数? 2022-09-22
- 跟在带量词的前瞻后面有什么作用? 2022-09-22
- 如何在hdf5文件的多个组之间拆分数据? 2022-09-21
- 如何将RPC与Volttron配合使用 2022-09-21
- 从顶点坐标创建三角网格 2022-09-21