149 votes

Dois-je utiliser « import os.path » ou « import os » ?

Selon la documentation officielle, os.path est un module. Donc, quel est le meilleur moyen de l'importer?

# Should I always import it explicitly?
import os.path

Ou...

# Is importing os enough?
import os

Merci de NE PAS répondre à "l'importation os fonctionne pour moi". Je sais, ça fonctionne pour moi aussi en ce moment (comme de la version 2.6 de Python). Ce que je veux savoir, c'est tout de recommandation officielle sur cette question. Donc, si vous répondez à cette question, merci de poster vos références.

172voto

Mike Graham Points 22480

os.path travaille dans une drôle de façon. Il ressemble os doit être un paquet avec un sous-module path, mais en réalité, os est normale module qui fait de la magie avec sys.modules d'injecter os.path. Voici ce qui arrive:

  • Quand Python démarre, il charge un tas de modules en sys.modules. Ils ne sont pas liés à des noms dans votre script, mais vous pouvez accéder à la déjà créé des modules lors de l'importation d'une certaine façon.

    • sys.modules est un dict dans lequel les modules sont mis en cache. Lorsque vous importez un module, si elle l'a déjà été importé quelque part, il est l'instance stockés dans sys.modules.
  • os est parmi les modules qui sont chargés quand Python démarre. Il cède ses path d'attribut pour un os spécifique chemin d'accès du module.

  • Il injecte sys.modules['os.path'] = path , de sorte que vous êtes capable de faire "import os.path" comme si c'était un sous-module.

J'ai tendance à penser d' os.path comme un module que je veux les utiliser plutôt que d' une chose dans l' os module, donc même si c'est pas vraiment un sous-module d'un paquet nommé os,- je importer un peu comme elle est une et je le fais toujours import os.path. Ceci est cohérent avec la façon dont os.path est documenté.


D'ailleurs, ce genre de structure conduit à beaucoup de programmeurs Python le début de la confusion au sujet de modules et packages et organisation du code, je pense. C'est vraiment, pour deux raisons

  1. Si vous pensez que d' os comme un paquet et de savoir que vous pouvez faire import os , et d'avoir accès à la sous-module os.path, vous pourriez être surpris plus tard, quand vous ne pouvez pas faire import twisted et accéder automatiquement twisted.spread sans l'importer.

  2. Il est source de confusion qu' os.name est une chose normale, une chaîne de caractères, et os.path est un module. J'ai toujours la structure de mes paquets vides __init__.py fichiers de sorte que, au même niveau, j'ai toujours un type de chose: un module/paquet ou d'autres choses. Plusieurs grands Python projets de prendre cette approche, qui tend à faire de plus structurée code.

30voto

Nick T Points 5466

Comme par PEP-20 par Tim Peters, "Explicite est mieux qu'implicite" et de "Lisibilité compte". Si vous avez besoin de l' os module est en os.path, import os.path serait plus explicite et laisser les autres savoir que vous vous souciez vraiment de.

De même, PEP-20 dit aussi "Simple est mieux que complexe", donc si vous avez aussi besoin de trucs qui se trouve sous le plus général os parapluie, import os serait préférable.

16voto

lesmana Points 8125

Réponse définitive : et . ne `` directement.

De la documentation du module lui-même :

8voto

Matt Boehm Points 1162

Fait intéressant à noter, l'importation d'os.chemin d'importer l'ensemble de l'os. essayez les solutions suivantes dans l'invite de commandes:

import os.path
dir(os)

Le résultat sera le même que si vous venez d'importer os. C'est parce que les os.chemin va se référer à un autre module basé sur le système d'exploitation que vous avez, de sorte python import os pour déterminer le module de charge pour le chemin.

référence

Avec certains modules, en disant: import foo ne sera pas exposer foo.bar, donc je suppose que ça dépend vraiment de la conception du module spécifique.


En général, juste de l'importation de l'explicite les modules dont vous avez besoin devrait être légèrement plus rapide. Sur ma machine:

import os.path: 7.54285810068e-06 secondes

import os: 9.21904878972e-06 secondes

Ces temps sont suffisamment proches pour être tout à fait négligeable. Votre programme peut avoir besoin d'utiliser d'autres modules d' os soit maintenant ou plus tard, donc en général il a un sens juste de sacrifier les deux microsecondes et utiliser import os pour éviter cette erreur à un moment plus tard. J'ai l'habitude de côté avec juste de l'importation d'os dans son ensemble, mais il peut voir pourquoi certains préfèrent import os.path pour, techniquement, être plus efficace et de transmettre aux lecteurs de code que c'est la seule partie de l' os module qui devront être utilisés. Il se résume essentiellement à un style de question dans mon esprit.

4voto

Chris Hulan Points 141

N’a pas pu trouver aucune référence définitive, mais je vois que l’exemple de code pour os.walk utilise os.path mais importe uniquement les os

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X