web-dev-qa-db-fra.com

En Python, quelle est la différence entre passe et retour

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)
27
Li Xiong
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
60
Ferdinand Beyer

Retour quitte la fonction ou la méthode en cours. Pass est une opération nulle et permet à l'exécution de continuer à l'instruction suivante.

18
ʇsәɹoɈ

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

1
eumiro

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. :))

1
Karl Knechtel

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.

0
jro