Supponiamo che abbia una funzione che fa cose con un file di testo - ad esempio legge da esso e rimuove la parola 'a'. Potrei passargli un nome di file e gestire l'apertura / chiusura della funzione, oppure potrei passarlo il file aperto e aspettarmi che chiunque lo chiami si occupi di chiuderlo.
Il primo modo sembra un modo migliore per garantire che nessun file rimanga aperto, ma mi impedisce di usare cose come gli oggetti StringIO
Il secondo modo potrebbe essere un po 'pericoloso - non c'è modo di sapere se il file sarà chiuso o no, ma sarei in grado di usare oggetti simili a file
def ver_1(filename):
with open(filename, 'r') as f:
return do_stuff(f)
def ver_2(open_file):
return do_stuff(open_file)
print ver_1('my_file.txt')
with open('my_file.txt', 'r') as f:
print ver_2(f)
Uno di questi è generalmente preferito? È generalmente previsto che una funzione si comporterà in uno di questi due modi? O dovrebbe essere solo ben documentato in modo tale che il programmatore possa usare la funzione come appropriato?