Jestem nowy w django i pomyślałem o zrobieniu prostej aplikacji django, aby dowiedzieć się więcej na ten temat. W jednym z miejsc w kodzie musiałem wybrać locationName
i pobieranie elementów, które pasują do tego samego identyfikatora co locationName
w stole. Kiedy zacząłem się zastanawiać continue
najbardziej pythoniczny sposób na ucieczkę z pętli for?
Kod, o którym mowa, podano poniżej:
for locationName in locationGroup:
idRef = locationName.id
try:
element = location.objects.order_by("-id").filter(name__id=idRef)[0]
except IndexError:
continue
Odpowiedzi:
8 dla odpowiedzi № 1Jeśli jest jakiś kod, którego nie chcesz wykonywać po klauzuli wyjątku, continue
jest całkowicie poprawny, w przeciwnym razie niektórzy mogą go znaleźć pass
bardziej odpowiedni.
for x in range(y):
try:
do_something()
except SomeException:
continue
# The following line will not get executed for the current x value if a SomeException is raised
do_another_thing()
for x in range(y):
try:
do_something()
except SomeException:
pass
# The following line will get executed regardless of whether SomeException is thrown or not
do_another_thing()
3 dla odpowiedzi № 2
To jest dokładnie to, co continue
/break
słowa kluczowe są, więc tak, jest to najprostszy i najbardziej pythoniczny sposób.
Powinien istnieć jeden - a najlepiej tylko jeden - czysty sposób na zrobienie tego.
2 dla odpowiedzi nr 3
Powinieneś użyć
try:
element = location.objects.order_by("-id").filter(name__id=idRef)[0]
except IndexError:
pass
1 dla odpowiedzi nr 4
Trudno jest powiedzieć, co robisz. Kod po prostu sprawdza, czy otrzymałeś jakieś wiersze z zapytania, patrząc na pierwszy element i wychwytując błąd IndexError.
Chciałbym napisać to w sposób, który uczyni tę intencję o wiele jaśniejszą:
for locationName in locationGroup:
idRef = locationName.id
rows = location.objects.order_by("-id").filter(name__id=idRef)
if rows: # if we have rows do stuff otherwise continue
element = rows[0]
...
W takim przypadku możesz użyć get
co czyni go jeszcze bardziej wyraźnym:
for locationName in locationGroup:
idRef = locationName.id
try:
element = location.objects.get(name__id=idRef)
except location.DoesNotExist:
pass