0

一連のタスクを順番に実行するプログラムを書いています。各タスクは新しいファイルを出力する関数ですが、ファイル名が既に存在する場合、特定のタスクは実行されません。この種のコードを何度も書いていることに気づきました。

task1_fname = task1()
# come up with filename for next task
task2_fname = "task2.txt"
if not os.path.isfile(task2_fname):
  # task2 might depend on task1's output, so it gets task1's filename
  task2(task1_fname)
task3_fname = "task3.txt"
if not os.path.isfile(task3_fname):
  task3(...)

基本的な考え方は、ファイルが存在する (理想的には空でない) 場合、このファイルを生成するタスクを実行すべきではないということです。

os.path.isfile毎回呼び出しを書かずにこれを表現するための最良の Pythonic の方法は何ですか? デコレータはこれをもっと簡潔に表現できますか? または、次のようなもの:

with task2(task1_fname):
  # continue to next task

何か案は?

4

1 に答える 1

3

このようなものをお探しですか?

def preserve_output(f):
    def wrap(input, output):
        if not os.path.isfile(output):
            f(input, output)
    return wrap

@preserve_output
def task1(input, output):
    ...

@preserve_output
def task2(input, output):
    ...

task1('input', 'output_1')
task2('output_1', 'output_2')
task3('output_2', 'output_3') etc
于 2012-10-17T15:49:10.587 に答える