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
-そう考えているのは正しいですか、もしそうなら、きちんとした方法はありますかこれ?
(注:入ってくるストリームを でラップすることを検討しましたio.BufferedReader
が、閉じると基になるストリームも閉じられることがわかりました...)