【发布时间】:2017-12-19 19:55:36
【问题描述】:
我们有一个具有以下使用模式的代码库:
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
但是,此文件不会被删除。当这个函数被谨慎调用并且依赖于文件缓存时这很好,但是当它被重复调用并且我们不想填满磁盘时就不好了。有没有办法用 context manager 重构代码,以便我们可以将其用作
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
但至关重要的是,不破坏现有用法,以便其他代码按原样工作?还是需要一个不同的方法来返回上下文管理器?
【问题讨论】:
-
您能否举例说明创建文件的代码以及您希望自动运行并删除文件的代码?
-
@quamrana 确定,已更新。
-
什么是
BigFileClass?是你控制的班级吗?它是否有close方法或其他一些执行清理的方法? -
@user2357112 是的,我控制它。它是一个方便的类来表示磁盘上的大数据文件。
标签: python temporary-files with-statement contextmanager