example - python os path filename
¿Debo usar `import os.path` o` import os`? (6)
Curiosamente, la importación de os.path importará todos los sistemas operativos. intente lo siguiente en el indicador interactivo:
import os.path
dir(os)
El resultado será el mismo que si acaba de importar el sistema operativo. Esto se debe a que os.path se referirá a un módulo diferente según el sistema operativo que tenga, por lo que python importará el sistema operativo para determinar qué módulo cargar para la ruta.
Con algunos módulos, decir import foo
no expondrá foo.bar
, así que supongo que realmente depende del diseño del módulo específico.
En general, solo importar los módulos explícitos que necesita debe ser marginalmente más rápido. En mi máquina:
import os.path
: 7.54285810068e-06
segundos
import os
: 9.21904878972e-06
segundos
Estos tiempos son lo suficientemente cercanos como para ser bastante insignificantes. Es posible que su programa tenga que usar otros módulos del sistema os
ya sea ahora o en otro momento, por lo que tiene sentido sacrificar los dos microsegundos y usar import os
para evitar este error más adelante. Usualmente estoy al lado de importar solo os como un todo, pero puedo ver por qué algunos preferirían import os.path
para ser técnicamente más eficientes y transmitir a los lectores del código que esa es la única parte del módulo os
que necesitará ser utilizada . Básicamente se reduce a una pregunta de estilo en mi mente.
De acuerdo con la documentación oficial , os.path
es un módulo. Por lo tanto, ¿cuál es la forma preferida de importarlo?
# Should I always import it explicitly?
import os.path
O...
# Is importing os enough?
import os
NO responda "importando os
funciona para mí". Lo sé, también funciona para mí en este momento (a partir de Python 2.6). Lo que quiero saber es cualquier recomendación oficial sobre este tema. Por lo tanto, si responde esta pregunta, publique sus referencias .
Estoy de acuerdo con Mike
creo
import os
está bien.
Solo tienes que mencionar detalles como este
os.path()
o si llamas a un módulo dentro de un módulo
os.path.exists()
No se pudo encontrar ninguna referencia definitiva, pero veo que el código de ejemplo de os.walk usa os.path pero solo importa el sistema operativo.
Respuesta definitiva: import os
y use os.path
. no import os.path
directamente.
De la documentación del módulo en sí:
>>> import os
>>> help(os.path)
...
Instead of importing this module directly, import os and refer to
this module as os.path. The "os.path" name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows),
os.path provides the same operations in a manner specific to that
platform, and is an alias to another module (e.g. macpath, ntpath).
...
Según PEP-20 de Tim Peters, "Explícito es mejor que implícito" y "Redabilidad cuenta". Si todo lo que necesita del módulo os
está bajo os.path
, import os.path
sería más explícito y les haría saber a los demás lo que realmente les importa.
Del mismo modo, PEP-20 también dice "Simple es mejor que complejo", por lo que si también necesita cosas que residen bajo el paraguas más general, sería preferible import os
.
os.path
funciona de una manera divertida. Parece que os
debe ser un paquete con una path
submódulo, pero en realidad os
es un módulo normal que hace magia con sys.modules
para inyectar os.path
. Esto es lo que sucede:
Cuando Python se inicia, carga un grupo de módulos en
sys.modules
. No están vinculados a ningún nombre en su secuencia de comandos, pero puede acceder a los módulos ya creados cuando los importa de alguna manera.-
sys.modules
es un dict en el que los módulos se almacenan en caché. Cuando importa un módulo, si ya se ha importado en algún lugar, obtiene la instancia almacenada ensys.modules
.
-
os
es uno de los módulos que se cargan cuando se inicia Python. Asigna su atributo depath
a un módulo de ruta específico del sistema operativo.Inyecta
sys.modules[''os.path''] = path
para que pueda hacer "import os.path
" como si fuera un submódulo.
Tiendo a pensar en os.path
como un módulo que quiero usar en lugar de algo en el módulo os
, así que aunque no es realmente un submódulo de un paquete llamado os
, lo importo como si fuera uno y siempre import os.path
. Esto es coherente con la forma en que se documenta os.path
.
Incidentalmente, este tipo de estructura conduce a una gran confusión inicial de los programadores de Python sobre módulos y paquetes y la organización del código, creo. Esto es realmente por dos razones
Si piensa en
os
como un paquete y sabe que puedeimport os
y tener acceso al submóduloos.path
, puede que se sorprenda más tarde cuando no puedeimport twisted
y acceder automáticamente atwisted.spread
sin importarlo.Es confuso que
os.name
es una cosa normal, una cadena, yos.path
es un módulo. Siempre estructuro mis paquetes con archivos__init__.py
vacíos para que al mismo nivel siempre tenga un tipo de cosa: un módulo / paquete u otras cosas. Varios grandes proyectos de Python toman este enfoque, que tiende a hacer un código más estructurado.