/ / Est-ce que "continuer" est la manière Pythonique d'échapper à un bloc try catch? - python, django

Est-ce que «continue» la manière pythonique de s'échapper d'un bloc de prise d'essai? - python, django

Je suis nouveau sur Django et j'ai pensé à faire une simple application Django pour en savoir plus, dans l'un des endroits du code que j'ai dû choisir locationName et obtenir des éléments correspondant au même identifiant que locationName dans une table. Quand j'ai commencé à me demander continue la façon la plus pythonique d'échapper à une boucle for?

Le code en question est donné ci-dessous:

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

Réponses:

8 pour la réponse № 1

S'il y a du code que vous ne voulez pas exécuter après la clause except, continue est parfaitement valide, sinon certains pourraient trouver pass plus approprié.

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 pour la réponse № 2

C'est exactement ce que le continue/break les mots clés sont pour, alors oui, c'est la manière la plus simple et la plus pythonique de le faire.

Il devrait y avoir une - et de préférence une seule - manière évidente de le faire.


2 pour la réponse № 3

Tu devrais utiliser

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

1 pour la réponse № 4

Vous faites un peu difficile de dire ce que vous faites. Le code vérifie simplement si vous obtenez des lignes de la requête, en regardant le premier élément et en attrapant l'IndexError.

Je l'écrirais d'une manière qui rend cette intention beaucoup plus claire:

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

Dans ce cas, vous pouvez utiliser get ce qui le rend encore plus clair:

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