¿Por qué hace la lista.índice de lanzar una excepción, en lugar de utilizar un valor arbitrario (por ejemplo, -1)? ¿Cuál es la idea detrás de esto?

Me parece más limpio para tratar con valores especiales, en lugar de excepciones.

EDITAR: no me di cuenta de -1 es potencialmente un valor válido. Sin embargo, ¿por qué no algo más? Cómo sobre un valor de Ninguno?

OriginalEl autor Joan Venge | 2009-03-23

10 Comentarios

  1. 13

    Porque -1 es en sí misma un índice válido. Se podría utilizar un valor diferente, como None, pero que no sería útil, que -1 puede ser en otras situaciones (por lo tanto str.find()), y equivaldría simplemente a la comprobación de errores, que es exactamente lo que son las excepciones.

    OriginalEl autor Devin Jeanpierre

  2. 8

    Para agregar a Devin respuesta: Este es un viejo debate entre los valores de retorno versus excepciones. Muchos gurús de la programación prefieren una excepción debido a una excepción, puedo llegar a ver todo el stacktrace y de inmediato inferir lo que está mal.

    Esto era lo que me preguntaba: especial de devolución de valores frente a las excepciones.
    +1: Excepciones, no dependen de algún valor «sagrado». Las excepciones son a menudo más fáciles de trabajar.
    El exceptiophobic personas podrían argumentar que index no encontrar un objeto no es un error, y las excepciones deben ser utilizados únicamente en los errores. Yo soy de las excepciones en este caso. Las excepciones pueden ser más rápido, ya que no tiene que hacer una verificación en el éxito. Python prefiere excepciones, en muchos casos debido a esto. En otras palabras, si index encuentra un objeto, la ejecución continúa con ninguna de las condiciones de verificación. Si index no encuentra nada, se produce en el bloque catch con no controles.
    El último comentario ignora el hecho de que la función subyacente de curso requiere para comprobar la condición de la(s) lo que hace fallar. La comprobación adicional para el especial valor es insignificante. La pregunta más importante es, de hecho, si no encontrar nada es un error. por supuesto, esto depende del caso de uso. Sin embargo, esta es una función bajo nivel que no debe mandato de cualquier uso específico por lo que es necesario depender de una lenta manejo de excepciones por lo tanto, esta es claramente un mal diseño porque la única alternativa es volver a implementar o utilizar aún más el rendimiento de reducción de técnicas como la comprobación con el conde de primera.

    OriginalEl autor amit

  3. 7

    Bien, el especial valor que realmente tiene que ser None, ya que -1 es un índice válido (es decir, el último elemento de una lista).

    Puede emular este comportamiento:

    idx = l.index(x) if x in l else None
    Siempre y cuando no te importa la búsqueda a través de la lista dos veces..
    bueno, es eso o try/except.

    OriginalEl autor vartec

  4. 5

    La «excepción-vs-el valor de error» el debate es, en parte, sobre el código de la claridad. Considere la posibilidad de código con un valor de error:

    idx = sequence.index(x)
    if idx == ERROR:
        # do error processing
    else:
        print '%s occurred at position %s.' % (x, idx)

    El manejo de errores termina metido en el medio de nuestro algoritmo, obstaculizando el flujo del programa. Por otro lado:

    try:
        idx = sequence.index(x)
        print '%s occurred at position %s.' % (x, idx)
    except IndexError:
        # do error processing

    En este caso, la cantidad de código es efectivamente el mismo, pero el algoritmo principal es ininterrumpida por el manejo de errores.

    OriginalEl autor John Fouhy

  5. 3

    En Python, -1 es un índice válido, es decir, un número desde el final de la lista (en lugar de al inicio), así que si usted fuera a hacer

    idx = mylist.index(someval)
    nextval = mylist[idx+1]

    entonces usted recibirá el primer valor de la matriz, en lugar de darse cuenta que había un error. De esta manera usted puede capturar la excepción y tratar con él. Si usted no desea excepciones, a continuación, sólo consultar de antemano:

    if someval in mylist:
        idx = mylist.index(someval)

    Edit: en realidad no Hay ningún punto en la devolución de Ninguno, porque si vas a prueba para Ninguno, así podría comprobar si el valor está en la lista de arriba!

    OriginalEl autor Phil H

  6. 3

    Es principalmente para asegurarse de que los errores se detectan tan pronto como sea posible. Por ejemplo, considere la siguiente:

    l = [1, 2, 3]
    x = l.index("foo")  #normally, this will raise an error
    l[x]  #However, if line 2 returned None, it would error here

    Te darás cuenta de que un error podría ser expulsado en l[x] en lugar de en x = l.index("foo") si el índice a devolver Nada. En este ejemplo, que no es realmente un gran problema. Pero imagino que la tercera línea está en algún lugar completamente diferente en un millón de línea de programa. Esto puede conducir a un poco de depuración de una pesadilla.

    OriginalEl autor Jason Baker

  7. 2

    Estoy de acuerdo con Devin Jeanpierre, y añadiría que la negociación con valores especiales puede parecer buena en pequeño ejemplo de los casos, pero (con algunas notables excepciones, por ejemplo, NaN en FPUs y Null en SQL) no escala tan bien. El único momento en el que trabaja es donde:

    • Has normalmente tiene un montón de anidado homogénea de procesamiento (por ejemplo, matemáticas o SQL)
    • No se preocupan por distinguir los tipos de errores de
    • No importa de donde se produjo el error
    • Las operaciones son puras funciones, sin efectos secundarios.
    • El fracaso puede ser posible, es decir, en el nivel superior (por ejemplo, «No hay filas coincidentes»)

    OriginalEl autor MarkusQ

  8. 1

    Una simple idea: -1 es perfectamente utilizable como un índice (como otros valores negativos).

    OriginalEl autor gimel

  9. 1

    Es un argumento semántico. Si desea conocer el índice de un elemento, se quejan de que ya existe en la lista. Si quieres saber si es o no existe, debe usar in.

    … y si dicen que existe una excepción es la manera correcta de manejar.

    OriginalEl autor recursive

  10. 0
    def GetListIndex(list, searchString):
        try:
            return list.index(searchString)
    
        except ValueError:
            return False
    
        except Exception:
            raise

    OriginalEl autor Mawg

Dejar respuesta

Please enter your comment!
Please enter your name here