在Python中实现可选的上下文管理器

2024-10-16 20:52:06 发布

您现在位置: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

但是,此文件不会被删除。当这个函数被谨慎地调用并且依赖于文件缓存时,这是好的,但是当它被重复调用并且我们不想填满磁盘时,这是坏的。有没有办法用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

但关键的是,在不破坏现有用法的情况下,,使其他代码按原样工作?或者需要一个不同的方法来返回上下文管理器吗?你知道吗


Tags: and文件key代码cachegetdownloadfactory
1条回答
网友
1楼 · 发布于 2024-10-16 20:52:06

因为您返回了一个BigFileClass实例来处理/表示数据,所以我建议如下。你知道吗

我假设每个实例的数据文件都是唯一的。你知道吗

  • 将实例变量添加到BigFileClass以跟踪数据文件的路径。你知道吗
  • __del__方法添加到BigFileClass,在该方法中删除数据文件。你知道吗

编辑:如果要将BigFileClass用作上下文管理器,请为BigFileClass定义__enter____exit__方法。在这种情况下,__enter__唯一要做的就是return self。你知道吗

我将把删除文件的任务留给__del__方法(当BigFileClass的引用计数达到0时)。当您已经删除了数据文件时,让类实例仍然存在是不对的。你知道吗


评论w.r.t.建筑。

对我来说,使用工厂似乎是不必要的麻烦事。在我看来,download_and_cache_big_dataset可能只是一个返回BigFileClass实例的函数。你知道吗

相关问题 更多 >