Pythonの関数デコレータでopenしてcloseする
Pythonにはデコレータという構文があります.
まだよく理解していませんが,関数function()の呼び出し時に,@decorator_nameで指定したclosureで前処理や後処理をすることができる機能です.
次のような書き方をします.
@decorator_name function()
ファイルのopenとcloseをデコレータに任せる
twitterで,こういう使い方はどう?と話題になったので試してみます.
関数foo(),関数bar()はあるファイルディスクリプタに対する処理をする関数とします.
これらの関数に渡すファイルディスクリプタをデコレータで生成して,定義関数に引き渡すことで,(スタンダードな使い方ではないと思いますが)ファイルのopen/closeを隠蔽することができています.
関数呼び出し時には引数がマッチしておらず、気持ち悪いのですが,fileopen中でfを渡しており,その時点では正しい引数を渡しています.
まあ,こんな使い方もできるんだなぁ,という記事でした.
def fileopen(filename): def recv_func(func): def wrapper(*args, **kwargs): f = open(filename,'r') result = func(f) return result return wrapper return recv_func @fileopen('hello.txt') def foo(f): str = f.read() print str, @fileopen('goodbye.txt') def bar(f): str = f.read() print str, print str, foo() bar()
実行結果
Hello, world! Good bye! Good bye!