2017-05-28 2 views
2

Ich verstehe, dass der with Block automatisch close() aufruft, nachdem Sie den Block verlassen, und dass es oft verwendet wird, um sicherzustellen, dass man nicht vergessen, eine Datei zu schließen.Ist der mit Block oder close() mehr Pythonic?

Es scheint, dass es zwischen

with open(file, 'r+') as f: 
    do_things(f) 

und

f = open(file, 'r+') 
do_things(f) 
f.close() 

ist eine Möglichkeit, mehr Pythonic als der andere keinen technischen Unterschied? Welchen sollte ich in meinem Code verwenden?

+3

Es gibt einen großen technischen Unterschied zwischen den beide! Die 'with'-Version stellt sicher, dass' close() 'aufgerufen wird, auch wenn' do_things() 'eine Ausnahme auslöst. Sie müssen der anderen Version ein "try" und ein "finally" hinzufügen, um diesem Verhalten zu entsprechen. – jasonharper

+1

FWIW, ich denke nicht, dass diese Frage ein Duplikat von 3012488 ist. Die Themen überschneiden sich, aber die andere Frage ist sehr weit gefasst und geht nicht speziell darauf ein, welcher Ansatz pythischer ist, um Dateien zu schließen. –

Antwort

4

Ist ein Weg mehr Pythonic als der andere?

Ja, das With-Statement-Formular wird bevorzugt, es kapselt die Dateiverwaltungslogik in eine einzige Codezeile ein. Das verbessert das Verhältnis von Business-Logik zu Admin-Logik, wodurch das Programm leichter zu lesen und zu begründen ist.

Per PEP 343, der Verwendungszweck der mit-Anweisung lautet:

This PEP adds a new statement "with" to the Python language to make 
it possible to factor out standard uses of try/finally statements.