入力ファイル名と出力ファイル名を受け取るデコレータ ファクトリを作成しました。
def run_predicate(source, target):
'''This is a decorator factory used to test whether the target file is older than the source file .'''
import os
def decorator(func):
'''This is a decorator that does the real work to check the file ages.'''
def wrapper(*args, **kwargs):
'''Run the function if target file is older than source file.'''
if not os.path.exists(target) or \
os.path.getmtime(source) > os.path.getmtime(target):
return func(*args, **kwargs)
else:
return None
return wrapper
return decorator
装飾された関数:
@run_predicate("foo.in", "foo.out")
def foo(a, b):
return a + b
foo()
これは基本的に、入力ファイルが出力ファイルよりも後に更新された場合にのみ実行されるように設定されています。問題は、さまざまな状況に応じて、依存関係、つまり入力ファイル名と出力ファイル名を動的に変更したいということです。たとえば、foo()
if "foo.in"
is newer than "foo.out"
;を実行したい場合があります。"spam.in"
また、が よりも新しい場合にのみ実行したい場合も"spam.out"
あります。関数の定義や装飾を変更せずに実行するにはどうすればよいですか?