shtaxxx日記

コンピュータアーキテクチャについて研究している研究者の日記や技術紹介

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!