Python: исключения в назначениях

Если я попробую следующий код (в Python 3.2.2),

def f():
    raise Exception

x = f()

тогда оказывается, что x нетронутый - он либо остается undefined, либо сохраняет любое значение, которое было ранее. Является ли это поведение гарантированным, когда правая сторона задания вызывает исключение? Я понимаю, что это очень простой вопрос, но я не могу найти много информации о том, как работает именно назначение. В более общем плане, всегда ли оценивается вся правая сторона, прежде чем что-либо, связанное с назначением? Это даже верно при использовании setattr, присваивании элементу списка или использовании распаковки (например, x, y = y, f())?

Ответ 1

Ссылка на язык Python указывает это:

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

Python оценивает выражения слева направо. Обратите внимание, что при оценке присваивания правая часть оценивается перед левой стороной.

Оценивается правая сторона, затем левая сторона, тогда происходит само присваивание. Таким образом,

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

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

x().a = y()

гарантированно печатать "y" и терпеть неудачу с NameError; он никогда не поднимет "x" или не попытается выполнить какое-либо задание.

Ответ 2

Документация Python, касающаяся оператора присваивания прямо не говорит о том, что левая часть задания никогда не затрагивается, когда поднимается правая сторона исключение, но после прочтения этой статьи кажется, что единственный способ избежать назначения - это создать исключение.

Заключение: левая сторона задания никогда не затрагивается, если возникает исключение