/ / Python Django sprawdza, czy atrybut istnieje, czy został ustawiony - python, django

Python Django sprawdza, czy atrybut istnieje, czy został ustawiony - python, django

mam User obiekt i UserInfo obiekt, który ma relację jeden do jednego. Właśnie dodaję UserInfo obiekt, który niektórzy użytkownicy już mają User obiekty, ale nie UserInfo obiekty. Chcę sprawdzić, czy obiekt użytkownika ma jeszcze powiązany obiekt UserInfo, a jeśli nie, przekieruj go na stronę, na której mogę uzyskać informacje. Nadal jestem nowy dla Pythona i próbowałem zrobić if request.user.user_info: który zgłasza wyjątek, gdy nie istnieje, więc skończyłem to:

 user = request.user
try:
user.user_info.university
except:
print "redirect to info page"

który działa dobrze, ale wydaje mi się, że wyjątki powinny być wyjątkami, a nie, jeśli substytuty instrukcji. Czy jest lepszy sposób to zrobić?

Odpowiedzi:

6 dla odpowiedzi № 1

Powiedziałbym, że obsługa tego z wyjątkami jest podejściem pytonowym. Możesz zrobić coś takiego:

try:
# do your thing when user.user_info exists
except AttributeError: # Be explicit with catching exceptions.
# Redirect.

Istnieje pojęcie programowania o nazwie it"s easier to ask for forgiveness than permission (EAFP) który jest szeroko stosowany w Pythonie. Zakładamy, że atrybuty, klucze i tak dalej istnieją dla danego obiektu i wychwytują wyjątki, gdy tego nie robią.

Oto kilka odniesień i pytań SO dotyczących EAFP.

Glosariusz w języku Python
Jaka jest zasada EAFP w Pythonie
EAFP i to, co jest naprawdę wyjątkowe