Supongamos que tengo una función que hace cosas con un archivo de texto, por ejemplo, lee y elimina la palabra 'a'. Podría pasarle un nombre de archivo y manejar la apertura / cierre de la función, o podría pasarle el archivo abierto y esperar que quienquiera que lo llame se ocupe de cerrarlo.
La primera forma parece ser una mejor manera de garantizar que no queden archivos abiertos, pero me impide usar objetos como StringIO
La segunda forma podría ser un poco peligrosa: no hay forma de saber si el archivo se cerrará o no, pero podría usar objetos parecidos a archivos
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)
¿Es uno de estos generalmente preferido? ¿Se espera generalmente que una función se comporte de una de estas dos formas? ¿O debería estar bien documentado para que el programador pueda utilizar la función según corresponda?