Me pregunto si es una mala manera de saltarse return None, cuando no es necesario.

Ejemplo:

def foo1(x):
    if [some condition]:
        return Baz(x)
    else:
        return None

def foo2(x):
    if [some condition]:
        return Baz(x)

bar1 = foo1(x)
bar2 = foo2(x)

En ambos casos, cuando la condición es falsa, la función devolverá con None.

OriginalEl autor Tomasz Wysocki | 2010-10-26

6 Comentarios

  1. 55

    Como usted dijo, return None es (casi) nunca es necesario.

    Pero usted debería considerar la posibilidad de que el intención de su código es mucho más clara con un explícito return None. Recuerde: una pieza de código también debe ser legible por seres humanos, y ser explícito, generalmente, ayuda.

    También ayuda a «cumplir» con import this 😛
    «Explícito es mejor que el implícito».
    Desde El Zen de Python python.org/dev/peps/pep-0020
    La gente repitiendo el «Zen de Python» me hacen constantemente con comentarios downvotes. Implícito es mejor que explícita cuando es más claro y evita la innecesaria redundancia.
    No return None a menos que el Ninguno valor de retorno mismo es significativo. El valor de retorno de __init__ es no significativas, por lo que explícitamente no retorno Ninguno. Si usted necesita para volver desde el centro de __init__ acaba de decir return, y no poner una innecesaria return al final de la función.

    OriginalEl autor rsenna

  2. 23

    Exponer lo que otros han dicho, yo uso un return None si la función debe devolver un valor. En Python, todas las funciones devuelven un valor, pero a menudo nos escriben funciones que sólo volver jamás Ninguno, porque su valor de retorno es ignorado. En algunos idiomas, estos serían llamados procedimientos.

    Así que si una función debe devolver un valor, entonces me asegúrese de que todas las rutas de código de devolución, y que la vuelta tiene un valor, incluso si no es Ninguno.

    Si una función «no» devolver un valor, es decir, si nunca es llamado por alguien a través de su valor de retorno, entonces es aceptar a la final sin retorno, y si tengo que regresar temprano, yo uso el desnudo formulario, return.

    OriginalEl autor Ned Batchelder

  3. 5

    Sí y No.

    En el caso más simple, es aceptar a saltar «retorno Ninguno», porque devuelve Ninguno en única condición negativa.

    Pero si hay anidada de evaluación de condición y los múltiples escenarios en los que una función puede devolver Ninguno. Me tienden a incluir como documentación visual de los escenarios.

    [Edición: Basado en el comentario de abajo]

    devolución o retorno Ninguno

    Prefiero «return None» al desnudo «retorno» como es explícito y más tarde, no hay nadie en duda si el retorno significaba el retorno de Ninguno o fue un error como que me faltaba algo.

    Incluso con la anidación sólo podría utilizar return en lugar de return None. A veces puede ser más clara para hacer el None explícito, pero a menudo la gente usa None para indicar algún tipo de caso excepcional, en cuyo caso la crianza de un bien denominado excepción sería mejor.
    Estoy de acuerdo con usted. Algunos de estos son hábitos. Aborrezco la uso solo de «retorno», como si me había perdido devolver algo. Yo prefiero «return None» en casos tales como estoy explícito que esto es lo que yo quería.
    Yo personalmente no uso Ninguno de excepcional valor, sino que se suele utilizar como marcador de posición para indicar lugar para el valor. [] o (), a continuación, indicar número indefinido de los resultados y para cierto tipo de funciones que son mejores Falsos como valor de retorno Ninguno (como Ninguna no es iterable)

    OriginalEl autor pyfunc

  4. 3

    Sí, si no se devuelve ningún valor de una función de Python, devuelve None. Así, si va a devolver explícitamente Ninguno es una decisión estilística.

    Personalmente, prefiero siempre devuelven un valor de claridad.

    OriginalEl autor JAL

  5. 0
    def foo1(x):
        try:
            return Baz(x)
        except:
            raise ValueError('Incorrect value fo Bac')

    o

    def foo3(x):
        return Baz(x) if <condition> else False

    Yo no creo en la mitad de la función definida, pero esta Falsa puede ser útil en la búsqueda de tipo de fallo de la poda.

    OriginalEl autor Tony Veijalainen

  6. 0

    El más pienso en ello, menos creo que el caso que usted describe muestra una buena práctica. Se obliga al cliente a discriminar, por lo que el código de cliente casi siempre de aspecto:

    b = foo1(123)
    if b is not None:
        ...

    No se podía ni escribir:

    if b:
        ...

    ya que, si Baz.__nonzero__ se sobrescribe, b podría evaluar a Falso, incluso si no es Ninguno. Sería mejor tener un Null-Baz instancia (AKA Objeto Nulo), por ejemplo:

    class Baz(object):
        def some_method(self):
            """some action:"""
            ...
        ...
    
    class BazNull(Baz):
        def some_method(self):
            """nothing happens here"""
        ...
    
    Baz.Null = BazNull()
    
    ...
    
    def foo1(x):
        if some_condition:
            return Baz(x)
        else:
            return Baz.Null
    
    ...
    
    b = foo1(123)
    b.some_method()

    El punto es: ayudar a que el cliente (que puede ser usted mismo!) para mantener Ciclomático De Complejidad baja. El menor número de ramas, el mejor.

    Buen punto. Pero en algunos casos me veo obligado a devolver Nada. Es decir. en Django Middleware volverá Ninguno en la mayoría de los métodos.
    Yo votada abajo esto porque incluso si la sugerencia es válida en algunos casos, está fuera del alcance de la pregunta.

    OriginalEl autor pillmuncher

Dejar respuesta

Please enter your comment!
Please enter your name here