/ / Чи "продовжувати" пітонічний спосіб вирватися з блоку спробу лову? - пітон, джанго

Чи "продовжувати" пітонічний спосіб вирватися з блоку спробу лову? - пітон, джанго

Я новачок у django і думав зробити просту програму django, щоб дізнатися більше про неї. В одному з місць у коді я повинен був вибрати locationName і отримання елементів, які відповідають тому самому id locationName в таблиці. Коли я почав цікавитись continue найпітонічніший спосіб уникнути фор-петлі?

Код, про який йдеться, подано нижче:

for locationName in locationGroup:
idRef = locationName.id
try:
element = location.objects.order_by("-id").filter(name__id=idRef)[0]
except IndexError:
continue

Відповіді:

8 для відповіді № 1

Якщо у вас є якийсь код, який ви не хочете виконувати після пункту, крім, continue цілком справедливий, інакше дехто може знайти pass більше підходить.

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 для відповіді № 2

Це саме те, що continue/break Ключові слова призначені для, так, так, це "найпростіший і пітонічний спосіб зробити це.

Там має бути один - і бажано тільки один - очевидний спосіб зробити це.


2 для відповіді № 3

Ви повинні використовувати

try:
element = location.objects.order_by("-id").filter(name__id=idRef)[0]
except IndexError:
pass

1 для відповіді № 4

Вам стає важко сказати, що ви робите. Код просто перевіряє, чи отримуєте ви будь-які рядки з запиту, переглядаючи перший елемент і вловлюючи IndexError.

Я б написав це так, що робить цей намір набагато зрозумілішим:

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]
...

У цьому випадку ви можете використовувати get що робить його ще більш зрозумілим:

for locationName in locationGroup:
idRef = locationName.id
try:
element = location.objects.get(name__id=idRef)
except location.DoesNotExist:
pass