filename example current __file__ python coding-style python-import

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.

reference

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 en sys.modules .
  • os es uno de los módulos que se cargan cuando se inicia Python. Asigna su atributo de path 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

  1. Si piensa en os como un paquete y sabe que puede import os y tener acceso al submódulo os.path , puede que se sorprenda más tarde cuando no puede import twisted y acceder automáticamente a twisted.spread sin importarlo.

  2. Es confuso que os.name es una cosa normal, una cadena, y os.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.