Voglio prendere un numero arbitrario di percorsi che rappresentano archivi tar annidati ed eseguire un'operazione sull'archivio più interno. Il problema è che il nesting può essere arbitrario, quindi anche il numero di gestori di contesto di cui ho bisogno è arbitrario.Come posso annidare un numero arbitrario di gestori di contesto di file Python?
Prendiamo, per esempio:
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))
Non posso utilizzare il with
del nesting syntax perché ci potrebbe essere un qualsiasi numero di livelli a nido dichiarazione. Non posso usare contextlib.nested
perché i documenti dicono che proprio lì:
... usando
nested()
per aprire due file è un errore di programmazione come il primo file non verrà chiuso prontamente se viene generata un'eccezione quando si apre il secondo file.
C'è un modo per usare costrutti di linguaggio per fare questo, o devo gestire manualmente la mia pila di oggetti di file aperti?
In 3.3, è possibile utilizzare [ 'contextlib.ExitStack'] (http: //docs.python. org/3/library/contextlib.html # contextlib.ExitStack). – delnan
@delnan - Ho una ** dipendenza ** che mi impedisce di usare Python 3:/ – detly
@delnan Nice! Non sapevo che questo fosse stato aggiunto in python3.3. Sembra una soluzione davvero pulita. – Bakuriu