os.pathFunciona de una manera divertida. Parece que osdebería ser un paquete con un submódulo path, pero en realidad oses un módulo normal que hace magia sys.modulespara inyectar os.path. Esto es lo que pasa:
Cuando Python se inicia, carga un montón de módulos sys.modules. No están vinculados a ningún nombre en su script, pero puede acceder a los módulos ya creados cuando los importe 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 alguna parte, se almacena la instancia sys.modules.
osse encuentra entre los módulos que se cargan cuando se inicia Python. Asigna su pathatributo a un módulo de ruta específico del sistema operativo.
Se inyecta sys.modules['os.path'] = pathpara que pueda " import os.path" hacer como si fuera un submódulo.
Tiendo a pensar os.pathen un módulo que quiero usar en lugar de una cosa en el osmódulo , por lo que aunque no es realmente un submódulo de un paquete llamado os, lo importo como si fuera uno y siempre lo hagoimport os.path . Esto es consistente con cómo os.pathse documenta.
Por cierto, este tipo de estructura conduce a una gran confusión temprana de los programadores de Python sobre módulos y paquetes y organización de código, creo. Esto es realmente por dos razones
Si piensa osen un paquete y sabe que puede hacer import osy tener acceso al submódulo os.path, puede sorprenderse más tarde cuando no pueda hacerlo import twistedy acceder automáticamente twisted.spreadsin importarlo.
Es confuso que os.namesea algo normal, una cadena y que os.pathsea un módulo. Siempre estructuro mis paquetes con __init__.pyarchivos vacíos para que al mismo nivel siempre tenga un tipo de cosas: un módulo / paquete u otras cosas. Varios grandes proyectos de Python adoptan este enfoque, que tiende a crear un código más estructurado.
import os.pathyo mismo y creo que es una mejor manera. Por "Esto es coherente con la forma en que se documenta os.path" quise decir que se le da su propia página en la documentación en docs.python.org/library/os.path.html .os.pyhecho se inyecta ensys.modules['os.path']. Entonces esta es la razón por la quefrom os.path import somethingrealmente funciona. Tenía curiosidad sobre cuándo se introdujo esto y verifiqué la fuente. Dato curioso: esto es de 1999, incluido por primera vez en Python 1.5.2. El compromiso original está aquí .Según PEP-20 de Tim Peters, "explícito es mejor que implícito" y "la legibilidad cuenta". Si todo lo que necesita del
osmódulo está debajoos.path,import os.pathsería más explícito y dejaría que otros sepan lo que realmente le importa.Del mismo modo, PEP-20 también dice que "lo simple es mejor que lo complejo", por lo que si también necesita cosas que residan bajo el
osparaguas más general ,import ossería preferible.fuente
import ostrata realmente de ser "simple" de ninguna manera significativa. Simple! = Corto.import osyimport os.pathes una tontería si, por ejemplo, necesitasos.getcwd()yos.path.isfile()Respuesta definitiva:
import osy usoos.path. No lo hagasimport os.pathdirectamente.De la documentación del módulo en sí:
fuente
os.pathmódulo que no existe, sino paraposixpath."Instead of importing this module directly, import os and refer to this module as os.path."se encuentra enposixpath.py(omacpath.py,ntpath.pyetc.). Estoy bastante seguro de que lo que quieren decir es que uno no deberíaimport posixpath(lo que funciona), sino más bien importar el módulo a travésosde una mejor portabilidad. No creo que tengan la intención de dar una recomendación sobre si se prefiereimport oso noimport os.path.Curiosamente, importar os.path importará todos los sistemas operativos. intente lo siguiente en el mensaje interactivo:
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á os para determinar qué módulo cargar para la ruta.
referencia
Con algunos módulos, decir
import foono 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 debería ser marginalmente más rápido. En mi máquina
import os.path:7.54285810068e-06segundosimport os:9.21904878972e-06segundosEstos tiempos son lo suficientemente cercanos como para ser bastante insignificantes. Es posible que su programa necesite usar otros módulos desde
osahora o más adelante, por lo que generalmente tiene sentido sacrificar los dos microsegundos y usarimport ospara evitar este error en un momento posterior. Por lo general, me inclino por importar el sistema operativo en su conjunto, pero puedo ver por qué algunos preferiríanimport os.pathser técnicamente más eficientes y transmitir a los lectores del código que esa es la única parte delosmódulo que deberá usarse. Esencialmente se reduce a una pregunta de estilo en mi mente.fuente
from os import pathhará que las llamadas al camino sean aún más rápidas si la velocidad es el problema.El sentido común funciona aquí:
oses un módulo y tambiénos.pathes un módulo. Tan solo importe el módulo que desea utilizar:Si desea utilizar funcionalidades en el
osmódulo, importeos.Si desea utilizar funcionalidades en el
os.pathmódulo, importeos.path.Si desea utilizar funcionalidades en ambos módulos, importe ambos módulos:
Para referencia:
Lib / idlelib / rpc.py utiliza
ose importaos.Lib / idlelib / idle.py utiliza
os.pathe importaos.path.Lib / surepip / init .py usa ambos e importa ambos.
fuente
No se pudo encontrar ninguna referencia definitiva, pero veo que el código de ejemplo para os.walk usa os.path pero solo importa os
fuente