2013-08-27 11 views
9

Per me il modo più idiomatico di chiamare tempfile.mkstemp() sarebbe come: (?)Come chiamare tempfile.mkstemp() con "with"? - o perché non restituisce un file con __exit __()?

with tempfile.mkstemp() as fd, filename: 
    pass 

tuttavia, questo ovviamente solleva AttributeError: __exit__

Calling os.close(fd) esplicitamente utilizzando try-finally è un modo semplice per risolvere questo problema, ma si sente come la violazione di Ci dovrebbe essere uno - e preferibilmente solo un modo - ovvio per farlo.

C'è un modo per "risolvere" questo in tempfile o c'è un motivo per cui questo è stato implementato in questo modo?

+4

Grazie per il downvote, si prega di commentare come migliorare la domanda. – Kimvais

risposta

5

Nel modulo tempfile ci sono altri modi più adatti per creare un file temporaneo, come ad esempio TemporaryFile() e altri.

In particolare, se non si desidera eliminare il file, utilizzare NamedTemporaryFile(), assegnando l'argomento .

7

Il funzionamento della dichiarazione with è definito in PEP 343, compresa la gestione del protocollo cosiddetta contesto:

Questo PEP propone che il protocollo consistente del inserire() e uscita() i metodi sono noti come "protocollo di gestione del contesto", e gli oggetti che implementano tale protocollo sono noti come "gestori di contesto ".

mkstemp non restituisce un manager contesto, cioè un oggetto che implementa le __enter__ e __exit__ metodi, e non è pertanto compatibile.

Una soluzione ovvia è creare una classe wrapper che implementa il protocollo del gestore di contesto.