Domanda

Risulta che "con" è una parola divertente per cercare su Internet.

Qualcuno sa che cosa l'affare è con nidificazione con le dichiarazioni in Python?
Sono stato rintracciare un bug molto scivolosa in uno script che ho scritto e ho il sospetto che è perché sto facendo questo:

with open(file1) as fsock1:
    with open(file2, 'a') as fsock2:
        fstring1 = fsock1.read()
        fstring2 = fsock2.read()

Python solleva quando provo a read() da fsock2. Al momento dell'ispezione nel debugger, questo è perché pensa che il file è vuoto. Questo non sarebbe preoccupante tranne per il fatto che l'esecuzione del codice esattamente lo stesso nella ricerca degli errori interperter non in una dichiarazione with mi indica che il file è, infatti, molto intera di testo ...

Ho intenzione di proseguire sul presupposto che per le dichiarazioni with ora annidamento è un no-no, ma se qualcuno che ne sa più ha un parere diverso, mi piacerebbe sentirlo.

È stato utile?

Soluzione

Ho trovato la soluzione nel doc di pitone. Si consiglia di dare un'occhiata al questo (3 Python) o < a href = "https://docs.python.org/2.7/reference/compound_stmts.html#the-with-statement" rel = "noreferrer"> questo (Python 2)

Se si esegue python 2.7+ è possibile utilizzarlo in questo modo:

with open(file1) as fsock1, open(file2, 'a') as fsock2:
    fstring1 = fsock1.read()
    fstring2 = fsock2.read()

In questo modo si evita il rientro inutili.

Altri suggerimenti

Per quanto ne so non è possibile leggere un file aperto con la modalità di aggiunta 'a'.

  

Al momento dell'ispezione nel debugger, questo è perché pensa che il file è vuoto.

Credo che accade perché non può realmente leggere nulla. Anche se potesse, quando si aggiunge a un file, il puntatore di ricerca viene spostato alla fine del file, in preparazione per la scrittura a verificarsi.

Queste dichiarazioni with funzionano bene per me:

with open(file1) as f:
    with open(file2, 'r') as g:   # Read, not append.
        fstring1 = f.read()
        fstring2 = g.read()

Si noti che l'uso di contextlib.nested, come un altro poster ha suggerito, è potenzialmente pieno di pericoli qui. Diciamo che si esegue questa operazione:

with contextlib.nested(open(file1, "wt"), open(file2)) as (f_out, f_in):
   ...

I gestori di contesto qui vengono creati uno alla volta. Ciò significa che se l'apertura di file2 non riesce (ad esempio, perché non esiste), allora non sarà in grado di finalizzare correttamente file1 e si dovrà lasciare a garbage collector. Questo è potenzialmente una cosa molto brutta.

Non c'è nessun problema con le dichiarazioni with nidificazione -. Anzi, si sta aprendo file2 per l'accodamento, quindi non si può leggere da esso

Se fai antipatia dichiarazioni with nidificazione, per qualsiasi motivo, spesso è possibile evitare che con il contextlib.nested funzione "rel =" nofollow noreferrer. Tuttavia, non farà codice di rotta (per esempio, il codice che apre un file per l'accodamento e poi cerca di leggerlo invece) di lavoro, né le dichiarazioni with lessicalmente nidificazione rompere codice che è altrimenti buona.

Per quanto riguarda la ricerca di "con", anteponendo una parola con '+' sarà impedire a Google di ignorarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top