2011-12-13 11 views
10

で例外は、Pythonの:私は(Pythonの3.2.2で)次のコードをしようとした場合の割り当て

def f(): 
    raise Exception 

x = f() 

xがそのままであることが表示されます - それは未定義のままか、それが以前に持っていたどのような値に保つのいずれか。この動作は、代入の右辺が例外をスローするたびに保証されますか?私はこれが非常に基本的な質問であることを認識していますが、割り当てがどのくらい正確に機能するかに関する多くの情報は見つかりません。より一般的には、割り当てに関する何かが起こる前に、右辺全体が常に評価されていますか? setattrを使用したり、リストの要素に割り当てたり、タプルのアンパック(例:x, y = y, f()など)を使用している場合は、これは正しいですか?

+2

を上昇させると代入の左側をタッチされることはありません、これは一貫している(ただPyPyでテスト、それはそこに同じです)が、私は」それがそうでなければならないという明示的な声明は見ていない。 –

+0

正式な仕様がないと、これは少し難しくなります(C、C++、Java、JavaScriptなどの人は正式な仕様を引用できます)。しかし、実用的には、実装のどれもが逸脱し、その動作は、逸脱した実装が壊れてしまうほど十分に重要です。 – delnan

答えて

12

ザ・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"を上げたり、割り当てを試みたりしません。

0

に関するPythonのドキュメントでは、右辺が例外を発生させても、割り当ての左辺には触れないと明示的には言われていませんが、この記事を読んだ後、代入を避けることは例外を発生させることです。

結論:例外は私の知る限りでは

関連する問題