Я новачок у 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