我们有一个具有以下使用模式的代码库:
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
但关键的是,在不破坏现有用法的情况下,,使其他代码按原样工作?或者需要一个不同的方法来返回上下文管理器吗?你知道吗
因为您返回了一个
BigFileClass
实例来处理/表示数据,所以我建议如下。你知道吗我假设每个实例的数据文件都是唯一的。你知道吗
BigFileClass
以跟踪数据文件的路径。你知道吗__del__
方法添加到BigFileClass
,在该方法中删除数据文件。你知道吗编辑:如果要将
BigFileClass
用作上下文管理器,请为BigFileClass
定义__enter__
和__exit__
方法。在这种情况下,__enter__
唯一要做的就是return self
。你知道吗我将把删除文件的任务留给
__del__
方法(当BigFileClass
的引用计数达到0时)。当您已经删除了数据文件时,让类实例仍然存在是不对的。你知道吗评论w.r.t.建筑。
对我来说,使用工厂似乎是不必要的麻烦事。在我看来,
download_and_cache_big_dataset
可能只是一个返回BigFileClass
实例的函数。你知道吗相关问题 更多 >
编程相关推荐