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()
)?
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. –
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