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.moduleses 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.
-
oses uno de los módulos que se cargan cuando se inicia Python. Asigna su atributo depatha un módulo de ruta específico del sistema operativo.Inyecta
sys.modules[''os.path''] = pathpara 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
oscomo un paquete y sabe que puedeimport osy tener acceso al submóduloos.path, puede que se sorprenda más tarde cuando no puedeimport twistedy acceder automáticamente atwisted.spreadsin importarlo.Es confuso que
os.namees una cosa normal, una cadena, yos.pathes un módulo. Siempre estructuro mis paquetes con archivos__init__.pyvací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.