/ / Czy „kontynuacja” to Pythoński sposób na ucieczkę z bloku try catch? - python, django

Czy "kontynuować" sposób Pythonic, aby uciec od bloku catch catch? - python, django

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 № 1

Jeś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