2011-10-24 10 views
17

He visto un código en Pinax y otras aplicaciones django que en lugar de pasar, se utiliza una declaración de devolución vacía. ¿Cuál es la diferencia y tendría algún efecto, por ejemplo, en el código django que estoy ejecutando? El código es un método de señal que guarda automáticamente los hashtags en taggit Tag objects para un objeto tweet.En Python, ¿cuál es la diferencia entre pasar y devolver

Vi una pregunta aquí acerca de si tener o no una declaración de devolución en PHP hace una diferencia en el bytecode interpretado, pero no estoy seguro si es relevante para 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) 
+0

e.g. no se puede definir una función/... muñón sin nada en ella. Pass es un noop/nullop –

Respuesta

47
if not instance: 
    return # will pass be better or worse here? 

Peor. Cambia la lógica. pass en realidad significa: No hacer nada. Si reemplazara return con pass aquí, el flujo de control continuaría, cambiando la semántica del código.

El objetivo de pass es crear bloques vacíos, lo que no es posible con el esquema de sangría de Python. Por ejemplo, una función de vacío en C se ve así:

void foo() 
{ 
} 

En Python, esto sería un error de sintaxis:

def foo(): 

Aquí es donde pass es muy útil:

def foo(): 
    pass 
16

Return sale de la función o método actual. Pass es una operación nula y permite que la ejecución continúe en la siguiente instrucción.

1
if not instance: 
    return # will pass be better or worse here? 

a pass continuará la ejecución del método. Un return terminaría la ejecución del método. En cuanto a las siguientes líneas, quiere poner return aquí.

else: 
    return # will a pass be better or worse here? 

aquí no haría la diferencia. Incluso eliminar las dos líneas completas no cambiaría nada.

Pero de todos modos, imagina que elaborarías el método aún más. Es mejor elegir el flujo correcto desde el principio.

0

Consulte los documentos de Python en pass y return. En su código actual, no hay realmente una diferencia (de hecho, dejaría el else completamente).

La diferencia se basa principalmente en la semántica: pass se puede utilizar donde se requiere sintácticamente una declaración, pero no (todavía) es necesaria. Por otro lado, return cumple una especie de contrato para una función, proporcionando un resultado explícito.

+0

He leído los documentos antes de publicarlos, pero realmente no entendí esto: "En una función de generador, la declaración de devolución no puede incluir una lista_expresión. En ese contexto, un retorno simple indica que el generador está hecho y hará que StopIteration se eleve ". Ahora está claro que simplemente significa "salir del flujo";) ¡Gracias! –

1

Esto es más de un comentario que una respuesta, pero no cabe como un comentario.

if not instance: 
    return # will pass be better or worse here? 

Como se explica en la respuesta aceptada, pass sería incorrecto.

else: 
    return # will a pass be better or worse here? 

Aquí, ya que estamos al final de la función, pass haría lo mismo: nada. Aún mejor sería dejar la cláusula else por completo, ya que no hay nada que hacer. (Es cierto que "explícito es mejor que implícito" en el Zen, pero esto rara vez se aplica a no hacer nada explícitamente; está claro lo que sucede en el caso else, para cualquiera que realmente se pregunte al respecto).

(Tampoco está claro por qué cambia el nombre de instance a post dentro de la función - ¿podría cambiar el nombre del parámetro? - o para qué se supone que es el argumento sender. Ah, y realmente no necesita convertir un set en a list para iterar sobre él en una lista de comprensión. :))

13

Esto ilustra algunas respuestas anteriores.

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 
+4

La respuesta aceptada capta mejor el "espíritu" de la diferencia, pero esta respuesta hace un gran trabajo al explicar la diferencia funcional. :) –

Cuestiones relacionadas