我有一个对象,我希望能够在其with
上使用关键字。我对实现上下文管理器的实用性感到满意,但我正在努力解决最佳实践类型的问题。
该对象是文件的包装器。我计划用字符串(文件的路径)或可以直接处理的类似文件来初始化我的对象(文件中有文件的可能性 - 所以我预见到一个明确的用例这与 BytesIO 等...)
所以__init__
看起来像这样:
def __init__(self, file_to_process):
if isinstance(file_to_process, str):
self._underlying_stream = open(file_to_process, "rb") # it's the path to a file
elif isinstance(file_to_process, io.IOBase):
self._underlying_stream = file_to_process # its the file itself
else:
raise TypeError()
所以我的问题是,_underlying_stream
在我的__exit__()
函数中关闭它是最佳实践/可接受/明智吗?当它是一条路径时,这完全是有道理的,但是如果它是一条经过的小溪,我觉得它充其量是不礼貌的,最坏的情况是关闭它是危险的self._underlying_stream
——我这样想是否正确,如果是这样,是否有一种巧妙的方法这个?
(注意:我考虑用 a 包装进来的流io.BufferedReader
,但事实证明关闭也会关闭底层流......)