Home > Python > [Python] try-exceptのスコープってどうなってんの

[Python] try-exceptのスコープってどうなってんの

前に、open()したファイルはエラーが起きてもちゃんと閉じるようにしましょう、ということをやっているサンプルコードを見たことがあったような気がして、うろ覚えながら試しに書いてみた。


def write(path, message):
    try:
        f = open(path, 'w')
        f.write(message)
    except IOError, e:
        print e
    finally:
        #print f
        f.close()

if __name__ == '__main__':
    message = 'test'
    write('test.txt', message)

なんとなく、動くのはわかるんだけど、不思議。
fがfinallyに渡るってのが、不思議。
ホントに来てんのか?と思ってprintしてみても、
<open file 'test.txt', mode 'w' at 0x01F1E0F8>
と表示されるから、処理が終わったからなんとなく閉じました、って感じではないっぽい。
ちゃんとclose()されてる。

try-exceptっていうよりは、Pythonのスコープがまだちゃんと理解できてないのかも。
インデントが変わったらスコープも変わる(っていう言い方であってるか自信ないですが、、、)ってことではないのですかね。

例えば関数ごとのスコープになってるとか?
ちょっと調べてみるか。

まぁ何にせよ、try-exceptはさんでfileのcloseが出来るってことがわかっただけでもずいぶん気持ちよくコードがかけます。

Comments:2

pes 2009/01/13

お久しぶりです。
お節介かと思いましたが、、、。

PythonクックブックP64から引用させてもらいます。

openの呼び出しを、このtry/finally文のtry節の中に置かないように注意してほしい(初心者がよくやるミスである)。もしファイルオープンの最中にエラーが起きたら、クローズすべきものが存在しないし、file_objectという名前にバインドされるオブジェクトもないのだ。こんなとき、file_object.close()などと呼びたいと思いますか?

ちょっと言い方がきついような気がしましたが、、、。
上記の通りだそうです。。。

tai 2009/01/13

>pesさん
ども、お久しぶりです。

> もしファイルオープンの最中にエラーが起きたら、クローズすべきものが存在しない
あーーーー、なるほど。
開かない場合に処理できないんですね。

> openの呼び出しを、このtry/finally文のtry節の中に置かないように注意してほしい(初心者がよくやるミスである)。
ども、初心者ですwwwww

なるほど、非常に参考になりました。
ありがとうございます。

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://blog.taikomatsu.com/2009/01/09/python-try-except%e3%81%ae%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%97%e3%81%a3%e3%81%a6%e3%81%a9%e3%81%86%e3%81%aa%e3%81%a3%e3%81%a6%e3%82%93%e3%81%ae/trackback/
Listed below are links to weblogs that reference
[Python] try-exceptのスコープってどうなってんの from memlog

Home > Python > [Python] try-exceptのスコープってどうなってんの

Return to page top