Jest to problem, który pojawił się podczas pracy nad projektem Django. Chodzi o walidację formularza.Python: Unikaj oceny zwarcia
W Django, po przesłaniu formularza można wywołać is_valid()
na odpowiednim obiekcie formularza, aby uruchomić sprawdzanie poprawności i zwrócić wartość typu Boolean. Tak, zazwyczaj masz kod tak wewnątrz Państwa zdanie funkcji:
if form.is_valid():
# code to save the form data
is_valid()
sprawdza nie tylko dane formularza, ale również dodaje komunikaty o błędach do obiektu formularza, który może być następnie wyświetlane użytkownikowi.
Na jednej stronie używam dwóch formularzy razem, a także chcę, aby dane były zapisywane, tylko jeśli oba formularze zawierają prawidłowe dane. Oznacza to, że muszę wywołać is_valid() na obu formularzach przed wykonaniem kodu, aby zapisać dane. Najbardziej oczywisty sposób:
if form1.is_valid() and form2.is_valid():
# ...
nie będzie działać z powodu oceny zwarcia operatorów logicznych. Jeśli formularz1 nie jest prawidłowy, formularz2 nie zostanie oceniony, a jego komunikaty o błędach będą nieobecne.
To tylko przykład. O ile mi wiadomo, nie ma chciwej alternatywy dla and
/or
, podobnie jak w innych językach (np. Smalltalk). Mogę sobie wyobrazić ten problem występujący w różnych okolicznościach (i nie tylko w Pythonie). Rozwiązania, o których mogłem myśleć, są wszelkiego rodzaju niezgrabne (zagnieżdżone ifs, przypisujące wartości zwracane do zmiennych lokalnych i używające ich w instrukcji if). Chciałbym poznać pytonowy sposób rozwiązania tego rodzaju problemów.
Z góry dziękuję!
Dokładnie to, czego szukałem. Dziękuję Ci! – j0ker
Zabrało mi to kilka sekund. Jest to przypadek narożny, którego wcześniej nie brałem pod uwagę (często pracuję w Fortranie, który nie gwarantuje zwarcia, ale pozwala na to) i zawsze staram się wymyślić, jak upewnić się, że moje wyrażenia są zwarte. Rozszyfrowanie tego było dla mnie trochę odwrotne :). – mgilson
Tak, "wszystko" jest tutaj, ale gdzie używasz zrozumienia list? Widzę tylko prostą listę na twoim przykładzie. – rantanplan