ネストされた tar アーカイブを表す任意の数のパスを取得し、最も内側のアーカイブに対して操作を実行したいと考えています。問題は、ネスティングが任意になる可能性があるため、必要なコンテキスト マネージャーの数も任意になることです。
たとえば、次のようにします。
ARCHIVE_PATH = "path/to/archive.tar"
INNER_PATHS = (
"nested/within/archive/one.tar",
"nested/within/archive/two.tar",
# Arbitary number of these
)
def list_inner_contents(archive_path, inner_paths):
with TarFile(archive_path) as tf1:
with TarFile(fileobj=tf1.extractfile(inner_paths[0])) as tf2:
with TarFile(fileobj=tf2.extractfile(inner_paths[1])) as tf3:
# ...arbitary level of these!
return tfX.getnames()
contents = list_inner_contents(ARCHIVE_PATH, INNER_PATHS))
ネストするレベルはいくつでもある可能性があるため、with
ステートメントのネスト構文は使用できません。contextlib.nested
ドキュメントに次のように記載されているため、使用できません。
...
nested()
2 番目のファイルを開くときに例外がスローされると、最初のファイルがすぐに閉じられないため、2 つのファイルを開くために使用することはプログラミング エラーです。
これを行うために言語構造を使用する方法はありますか?それとも、開いているファイル オブジェクトの独自のスタックを手動で管理する必要がありますか?