2012-08-13 10 views
16

Duplicar posible:
Python - When to use file vs open¿Por qué es preferible abrir() sobre el archivo() en Python?

De la documentación oficial de Python,

http://docs.python.org/library/functions.html#file

Al abrir un archivo, es preferible utilizar abierta() en su lugar de invocar este constructor directamente

Pero no da una razón.

+3

Para empezar, se ha ido en Python 3. A pesar de que es una consecuencia y de refuerzo, no es una razón. – delnan

+0

@delnan ¿Qué tipo devuelve 'abrir' en py3 entonces? – Marcin

+1

No estoy seguro de esto, por lo que no responderé, pero puede tener que ver con cómo maneja Python la palabra clave "con". No estoy seguro si puedes usar "con" con un constructor. –

Respuesta

15

The Zen of Python:

Debe haber uno-- y preferiblemente sólo una manera --obvious para hacerlo.

O bien file o bien debería ir.

>>> type(file) 
<type 'type'> 
>>> type(open) 
<type 'builtin_function_or_method'> 

open es una función que puede devolver cualquier cosa. file() devuelve solo file objetos.

Aunque parece open sólo devuelve file objetos en Python 2. Y antes de Python 2.5 file y open son el mismo objeto.

Como @gnibbler sugirió en los comentarios, la razón original para la existencia de file podría ser usarlo como el nombre para las clases base.

Además, file(), en principio, podrían regresar otros tipos como por ejemplo int() hizo en versiones anteriores de Python:

>>> type(int(2**64)) is long 
True 
>>> type(int()) is int 
True 
>>> int is long 
False 

Esta respuesta es muy similar a @Ryan's answer.

Además BDFL said:

"La clase de archivo es nuevo en Python 2.2 Representa el tipo (clase) de objetos devueltos por el incorporado en la función open() su constructor es una.. alias para open(), pero para compatibilidad futura y retroactiva, open() sigue siendo preferido. " (el énfasis es mío)

+0

¿De verdad devuelve algo más que objetos 'file'? – delnan

+1

@delnan: hasta donde yo sé devuelve objetos 'file' en Python 2. Devuelve objetos de diferentes tipos en Python 3. – jfs

+0

Originalmente' file' era y alias de 'open' porque parecía incómodo para la subclase' open' –

Cuestiones relacionadas