這是我在Django項目中發生的一個問題。這是關於表單驗證。Python:避免短路評估
在Django中,當你有一個提交的表單時,你可以在相應的表單對象上調用is_valid()
來觸發驗證並返回一個布爾值。所以,平時你有這樣的代碼裏面視圖功能:
is_valid()
不僅驗證表單數據,而且還增加了錯誤消息,可以事後向用戶顯示錶單對象。
在一個頁面上,我一起使用了兩個表單,並且還希望僅當兩個表單都包含有效數據時才保存數據。這意味着我必須在執行代碼保存數據之前在兩個窗體上調用is_valid()。最明顯的方法是:
if form1.is_valid() and form2.is_valid():
# ...
由於邏輯運算符的短路評估而不起作用。如果form1無效,form2將不會被評估,並且其錯誤消息將會丟失。
這只是一個例子。據我所知,與其他語言(即Smalltalk)相比,and
/or
沒有貪婪的替代選擇。我可以想象在不同情況下發生的問題(不僅在Python中)。我能想到的解決方案都是笨拙的(嵌套ifs,將返回值分配給局部變量並在if語句中使用它們)。我想知道解決這類問題的pythonic方法。
在此先感謝!
正是我所期待的。謝謝! – j0ker
這花了我幾秒鐘的時間。這是我之前沒有考慮過的一個角落案例(我經常在Fortran工作,但不能保證短路,但允許它),而且我總是試圖弄清楚如何確保我的表達式被短路。搞清楚這一點對我來說有點倒退:)。 – mgilson
是的'全部'是去這裏的路,但你在哪裏使用列表解析?我只看到一個簡單的例子。 – rantanplan