Python: Comment faire la boucle for pour continuer à partir d'une fonction?
Parfois j'ai besoin de suivre le modèle suivant dans un for
boucle. Parfois plus d'une fois dans la même boucle:
try:
var = 'attempt to do something that may fail on a number of levels'
except Exception, e:
log(e)
continue
Maintenant, je ne vois pas une belle façon de terminer dans une fonction qu'il ne peut pas return continue
:
def attempt(this):
try:
return this
except Exception, e:
log(e)
# 1. continue # <-- syntax error: continue not properly in loop or
# 2. return continue # <-- invalid syntax
# 3.
return False # <-- this sort of works, but makes me feel powerless
Si je return False
que je le pouvais:
var = attempt('to do something that may fail on a number of levels')
if not var:
continue
Mais je ne pense pas que le fait de la justice. Je veux dire pour la boucle de continue
(ou faux) de l'intérieur attempt
fonction.
Pourquoi l'envie d'envelopper les quatre simples lignes de code [try-except-journal-continuer] dans quelque chose de moins transparent?
Quel est le problème avec le déclenchement d'une exception à l'intérieur de la fonction, puis l'attraper à l'intérieur de votre boucle?
Vous êtes en train de faire à tort et à travers. Si vous utilisez une boucle for comme un modèle commun, wrap que à l'intérieur d'une fonction, pas la boucle d'éléments.
En regardant ce, quelques années plus tard, "sauf Exception” ou “sauf Exception, comme le e:” est le plus diabolique Python antipattern realpython.com/blog/python/...
Quel est le problème avec le déclenchement d'une exception à l'intérieur de la fonction, puis l'attraper à l'intérieur de votre boucle?
Vous êtes en train de faire à tort et à travers. Si vous utilisez une boucle for comme un modèle commun, wrap que à l'intérieur d'une fonction, pas la boucle d'éléments.
En regardant ce, quelques années plus tard, "sauf Exception” ou “sauf Exception, comme le e:” est le plus diabolique Python antipattern realpython.com/blog/python/...
OriginalL'auteur F. Malina | 2011-05-20
Vous devez vous connecter pour publier un commentaire.
Python a déjà une très belle construction pour le faire et il n'utilise pas
continue
:Je n'aurais pas nest pas plus que cela, bien que, ou votre code va bientôt devenir très laid.
Dans votre cas, je serais probablement faire quelque chose de plus comme ce qu'il est beaucoup plus facile de l'unité de tester les différentes fonctions et l'appartement est mieux que imbriquée:
N'oubliez pas de toujours catch certains des exceptions. Si vous n'attendiez pas une spécifiques exception, il n'est probablement pas sûr de continuer avec votre boucle de traitement.
Modifier les commentaires suivants:
Si vous ne voulez vraiment pas à gérer les exceptions, encore que je pense que c'est une mauvaise idée, alors attraper toutes les exceptions (
except:
) et au lieu dehandle(e)
, justepass
. À ce stade,wrap_process()
prendra fin, en ignorant laelse:
-bloc où le vrai travail est fait, et vous pourrez passer à l'itération suivante de votrefor
en boucle.Garder à l'esprit, Les erreurs ne doivent jamais passer sous silence.
Malina: Désolé de l'entendre. La partie ne répond pas à vos besoins?
else:
ressemble le plus Pythonic façon de remédier à cette situation pour moi.Malina: Si tout le reste du cycle est dans la
else:
-bloc, (enveloppé dansdo_something_with()
de la propreté), il ignore le reste de la boucle et passe au cycle suivant comme vous le souhaitiez. Essayez d'exécuter mon code d'exemple pour une plus ample démonstration.Malina, il ressemble à Johnsyweb la réponse est exactement ce que vous avez décrit dans votre question. Le code que vous avez écrit et le code qui Johnsyweb a fourni serait la même en Python. Vous devriez vraiment essayer ou d'examiner attentivement.
Malina: Parfois, vous devez silence certains erreurs. L'enregistrement n'est pas de la répression.
OriginalL'auteur Johnsyweb
L'idée d'exceptions, c'est qu'ils fonctionnent sur plusieurs niveaux d'indirection, c'est à dire, si vous avez un message d'erreur (ou de tout autre exceptionnelle état) de profondeur à l'intérieur de votre hiérarchie d'appel, vous pouvez toujours le prendre sur un niveau plus élevé et de le gérer correctement.
Dans votre cas, dites que vous avez une fonction de la tentative() qui appelle les fonctions tentative2 a() et attempt3() en bas de la hiérarchie d'appel, et attempt3() peut avoir un état d'exception qui devrait faire la boucle principale de résilier:
Vous pouvez même jeter un mannequin d'exception-vous, cela ne ferait que causer l'arrêt de la boucle, et de ne même pas être connecté.
you can still catch it on a higher level and handle it properly
--> très utile rappel 🙂OriginalL'auteur Boaz Yaniv
Peut-être que vous voulez faire les suites? Vous pourriez aller et de regarder comment les Eric Lippert explique (si vous êtes prêt à avoir votre esprit soufflé, mais en Python il pourrait ressembler un peu à ça:
À l'intérieur de votre boucle, vous pourriez faire:
OriginalL'auteur Daren Thomas
Pense que vous êtes la cartographie
foo
sur tous les articles oùattempt
travaillé. Doncattempt
est un filtre et il est facile d'écrire cela comme un générateur:OriginalL'auteur Jochen Ritzel
Vous pouvez utiliser ceci:
mais vous devez vous assurer de la tentative() retourne True ou False.
Vraiment, même si, Johnsyweb la réponse est probablement mieux.
OriginalL'auteur
Je ne devrais pas poster une réponse, mais c'est une approche alternative si vous n'aimez vraiment pas ma première réponse.
Rappelez-vous qu'une fonction peut renvoyer une
tuple
.Je maintiens que
try ... except ... else
est la voie à suivre, et vous ne devriez pas ignorer en silence les erreurs. Caveat emptor et tout ça.Je suis désolé, je ne peut pas vous aider. Il n'y a pas de
goto
en Python. Et à juste titre.OriginalL'auteur Johnsyweb
Outre le contexte, je veux juste répondre à la question dans un bref mode. Non, une fonction ne peut pas
continue
une boucle, il peut être appelé. C'est parce qu'elle n'a aucune informations à propos de ce contexte. Aussi, il soulèverait une toute nouvelle classe de questions comme: quels sont passerait-il si cette fonction est appelée sans entouré d'une boucle pour traiter lacontinue
?MAIS une fonction peut signal par divers moyens qu'il veut à l'appelant de
continue
une boucle actuellement, elle effectue. Un moyen de cours est la valeur de retour. RetourFalse
ouNone
de le signaler par exemple. Une autre façon de signalisation c'est à l'élève uneException
:OriginalL'auteur Alfe
mettre la boucle for à l'extérieur de l'essayer, à l'exception du bloc ... simple... 😉
OriginalL'auteur Schopenhauer
Edit: Supprimé tout ce qui bêtise je l'ai dit...
La réponse finale a été de réécrire l'ensemble de la chose, de sorte que je n'ai pas besoin de code comme ça.
OriginalL'auteur F. Malina