2011-12-13 24 views
10

Si intento el siguiente código (en Python 3.2.2),Python: excepciones en las asignaciones

def f(): 
    raise Exception 

x = f() 

entonces parece que es x como estaba - o bien permanece indefinido o mantiene cualquier valor que tenía previamente. ¿Este comportamiento está garantizado siempre que el lado derecho de una tarea arroje una excepción? Me doy cuenta de que esta es una pregunta muy básica, pero no puedo encontrar mucha información sobre cómo funciona exactamente la asignación. En términos más generales, ¿todo el lado derecho siempre se evalúa antes de que ocurra algo relacionado con la asignación? ¿Esto es cierto incluso al usar setattr, asignar a un elemento de una lista o usar desempaquetado de tuplas (es decir, algo así como x, y = y, f())?

+2

Por lo que yo sé, esto es consistente (solo probado en PyPy, que es la misma que hay), pero me No he visto ninguna declaración explícita de que deba ser el caso. –

+0

Bueno, la ausencia de una especificación formal hace que esto sea un poco difícil (los tipos C, C++, Java, JavaScript, etc. simplemente pueden citar una especificación formal). Pero pragmáticamente, ninguna de las implementaciones se desvía y el comportamiento es lo suficientemente importante como para que las implementaciones que se desvían se llamen rotas. – delnan

Respuesta

12

referencia del lenguaje Python especifica lo siguiente:

http://docs.python.org/reference/expressions.html#evaluation-order

Python evalúa las expresiones de izquierda a derecha. Tenga en cuenta que al evaluar una tarea, el lado derecho se evalúa antes que el lado izquierdo.

Se evalúa el lado derecho, luego el lado izquierdo, luego la asignación en sí. Por lo tanto,

def x(): 
    print "x" 
    fail() 

def y(): 
    print "y" 
    fail() 

x().a = y() 

está garantizado para imprimir "y" y fallar con NameError; nunca aumentará "x" ni intentará ninguna asignación.

0

La documentación de Python relativa al no dice explícitamente que el lado izquierdo de una tarea nunca se toca cuando el lado derecho genera una excepción, pero después de leer este artículo, parece que la única forma de evitar la asignación es levantar una excepción.

Conclusión: el lado izquierdo de una asignación no se toca, si se produce una excepción

Cuestiones relacionadas