で、オプションのコンテキストマネージャを実装します。我々は以下の使用パターンとコードベースを持っているのPython
factory = DataFactory(args)
dataset = factory.download_and_cache_big_dataset(key)
metadata = dataset.get_some_metadata()
現在、download_and_cache_big_dataset
はS3からの非常に大きなファイルを取得し、どこかにそれを置きます。とりわけ、
filename = get_s3_key(key)
filepath = os.path.join(get_tmp_dir(), filename)
s3.download_file(key, filepath)
return BigFileClass(filepath) # gets stored in a class somewhere
ただし、このファイルは削除されません。この関数が控えめに呼び出され、ファイルキャッシングに依存している場合は問題ありませんが、繰り返し呼び出されてディスクをいっぱいにしたくない場合は悪いです。であるように、他のコードが動作するように我々は、既存の利用状況を壊すことなく
factory = DataFactory(args)
with factory.download_and_cache_big_dataset(key) as dataset:
metadata = dataset.get_some_metadata()
# do something with metadata
# file gets automatically deleted
しかし、批判的に、としてそれを使用することができるようにcontext managerでコードをリファクタリングする方法はありますか?あるいは、コンテキストマネージャを返す別のメソッドが必要になるでしょうか?
ファイルを作成するコードと、自動的にファイルを削除するように実行するコードの例を挙げることができますか? – quamrana
@quamrana確かに更新されました。 –
[使用後にファイルを削除するために 'with'を使用する] Pythonの重複の可能性あり(https://stackoverflow.com/questions/5019209/python-using-with-to-delete-a-file-after-use) – quamrana