2010-09-15 20 views
9

He leído sobre cuándo usar assert vs. Exceptions, pero todavía no lo estoy "obteniendo". Parece que cada vez que pienso que estoy en una situación en la que debería usar assert, más adelante en el desarrollo, encuentro que estoy "mirando antes de saltar" para asegurarme de que la afirmación no falla cuando llamo a la función. Dado que hay otro modismo en Python sobre preferir usar try -excepto, generalmente termino abandonando el assert y lanzando una excepción en su lugar. Todavía tengo que encontrar un lugar donde parezca correcto usar una afirmación. ¿Alguien puede encontrar algunos buenos ejemplos?Ejemplo de uso de assert en Python?

Respuesta

20

Una buena guía está utilizando assert cuando su activación significa un fallo en el código. Cuando su código asume algo y actúa sobre la suposición, se recomienda proteger esta suposición con un assert. Este error assert significa que su suposición no es correcta, lo que significa que su código no es correcto.

3

Generelly, aseverar está allí para verificar una suposición que tiene sobre su código, es decir, en ese punto en el tiempo, o bien la afirmación tiene éxito, o su implementación es de alguna manera con errores. Una excepción es esperar que ocurra un error y "abrazarlo", es decir, permitirle manejarlo.

3

Un buen ejemplo es el control de los argumentos de una función de coherencia:

def f(probability_vector, positive_number): 
    assert sum(probability_vector) == 1., "probability vectors have to sum to 1" 
    assert positive_number >= 0., "positive_number should be positive" 
    # body of function goes here 
+1

Interesante - No sabía que '0.' era la abreviatura de' 0.0'. repl dice que es así. Sin embargo, es posible que no lo use en código real porque parece demasiado "inteligente" y se puede perder fácilmente. Podría entenderse como un error tipográfico, pero 0.0 siempre se entiende como un flotador. – Daenyth

+0

Esto parece similar a una situación en la que tenía una función que estaba buscando un elemento de una matriz 2D. Tenía sentido afirmar que las entradas de fila y columna estaban realmente dentro de los límites de la matriz. Pero luego estaba haciendo algo en donde tomé un elemento y quería hacer algo con los elementos adyacentes. Una vez que comencé a codificar esto, tuve que tener casos especiales cuando el elemento estaba en el borde, porque los elementos adyacentes estaban fuera de la matriz. Parecía mejor simplemente usar excepciones en su lugar. – Colin

+0

¿Cómo podrían las excepciones facilitar la modificación del código? Cuando cambias el comportamiento de la función, aún tienes que modificar la parte de la excepción, ¿no? – pberkes

15

tienden a usar afirmar para verificar que nunca ocurra. algo así como un control de cordura.

Otra cosa es darse cuenta de que asserts se eliminan cuando optimizado:

El generador de código actual emite ningún código de una sentencia assert cuando se solicita la optimización en tiempo de compilación.

+4

+1 para señalar que eso se elimina si invoca a Python con el indicador '-O'.El punto es que si * esperas * que tu código se comporte alguna vez de manera diferente si quitas los asertos, entonces los estás utilizando de manera incorrecta, solo para depuración. –