J'ai vu du code dans Pinax et d'autres applications Django qui, au lieu de passer, une déclaration de retour vide est utilisée. Quelle est la différence et cela aurait-il un effet sur, par exemple, le code Django ci-dessous que je cours? Le code est une méthode de signalisation qui enregistre automatiquement les hashtags dans des objets Taggit Tag pour un objet Tweet.
J'ai vu une question ici de savoir si le fait d'avoir ou non une instruction return dans PHP ait une incidence sur le code octet interprété, mais je ne suis pas sûr que ce soit pertinent pour Python.
import re
TAG_REGEX = re.compile(r'#(?P<tag>\w+)')
def get_tagged(sender, instance, **kwargs):
"""
Automatically add tags to a Tweet object.
"""
if not instance:
return # will pass be better or worse here?
post = instance
tags_list = [smart_unicode(t).lower() for t in list(set(TAG_REGEX.findall(post.content)))]
if tags_list:
post.tags.add(*tags_list)
post.save()
else:
return # will a pass be better or worse here?
post_save.connect(get_tagged, sender=Tweet)
if not instance:
return # will pass be better or worse here?
Pire. Cela change la logique. pass
signifie en réalité: ne faites rien. Si vous remplaciez return
par pass
ici, le flux de contrôle se poursuivrait, ce qui changerait la sémantique du code.
Le but de pass
est de créer des blocs vides, ce qui n’est pas possible avec le schéma d’indentation de Python. Par exemple, une fonction vide en C ressemble à ceci:
void foo()
{
}
En Python, ce serait une erreur de syntaxe:
def foo():
C'est ici que pass
est utile:
def foo():
pass
Ceci illustre certaines réponses précédentes.
def p():
"Executes both blocks."
if 1:
print(1)
pass
if 1:
print(2)
pass
def r():
"Executes only the first block."
if 1:
print(1)
return
if 1:
print(2)
return
if not instance:
return # will pass be better or worse here?
pass
continuerait l'exécution de la méthode. Un return
mettrait fin à l'exécution de la méthode. En ce qui concerne les lignes suivantes, vous voulez mettre return
ici.
else:
return # will a pass be better or worse here?
ici cela ne ferait aucune différence. Même supprimer les deux lignes ne changerait rien.
Quoi qu'il en soit, imaginez que vous développiez davantage la méthode. Il vaut mieux choisir le bon flux dès le début.
C'est plus un commentaire qu'une réponse, mais cela ne correspond pas à un commentaire.
if not instance:
return # will pass be better or worse here?
Comme expliqué dans la réponse acceptée, pass
serait incorrect.
else:
return # will a pass be better or worse here?
Ici, puisque nous sommes à la fin de la fonction, pass
ferait la même chose: rien. Mieux encore, il faudrait laisser de côté la clause else
, car il n’ya rien à faire. (Il est vrai que «explicite vaut mieux qu'implicite» dans le zen, mais cela s'applique rarement à ne rien faire explicitement - ce qui se passe dans le cas de else
est clair, pour quiconque s'en pose la moindre question. )
(On ne sait pas non plus pourquoi vous renommez instance
en post
dans la fonction - vous pouvez simplement changer le nom du paramètre? - ou à quoi sert l'argument sender
. Oh, et vous n'avez pas réellement besoin de convertir un set
en list
pour le parcourir dans une liste de compréhension. :))
Voir la documentation python sur pass et return . Dans votre code actuel, il n'y a pas vraiment de différence (en fait, je laisserais la else
entièrement à l'écart).
La différence réside principalement dans la sémantique: pass
peut être utilisé lorsqu'une déclaration est requise du point de vue de la syntaxe, mais pas encore. Par contre, return
remplit une sorte de contrat pour une fonction, fournissant un résultat explicite.