2012-03-08 3 views
7

Quel style est préférable?importer au niveau du module ou au niveau de la fonction?

Style A:

def foo(): 
    import some_module 
    some_module.something 

Style B:

import some_module 

def foo(): 
    some_module.something 

On suppose que some_module n'est pas utilisé ailleurs dans le code, seulement à l'intérieur de cette fonction.

Répondre

15

En effet, comme déjà noté, il est généralement préférable de suivre la recommandation PEP 8 et de faire vos importations au sommet. Il y a quelques exceptions cependant. La clé pour les comprendre réside dans votre question intégrée dans votre deuxième paragraphe: "à quel stade l'importation ... se produit-elle?"

L'importation est en fait une instruction exécutable. Lorsque vous importez un module, toutes les instructions exécutables du module s'exécutent. "def" est aussi une instruction exécutable; son exécution provoque l'association du nom défini avec le code (déjà compilé). Donc, si vous avez:

def f(): 
    import something 
    return None 

dans un module que vous importez, le (compilé) déclarations d'importation et de retour se sont associés avec le nom « f » à ce moment-là. Lorsque vous exécutez f(), l'instruction d'importation s'exécute.

Si vous différez l'importation de quelque chose qui est "très gros" ou "lourd", et que vous n'exécutez jamais la fonction (dans ce cas f), l'importation ne se produit jamais. Cela économise du temps (et de l'espace aussi). Bien sûr, une fois que vous appelez f(), l'importation se produit (si cela est déjà arrivé une fois que Python utilise le résultat mis en cache, mais il doit encore vérifier), vous perdez votre avantage de temps. Par conséquent, en règle générale, "importez tout en haut" jusqu'à ce que vous ayez fait beaucoup de profilage et découvert que l'importation de "hugething" vous fait perdre beaucoup de temps dans 90% de vos courses, par rapport à l'enregistrement. un peu de temps dans 10% d'entre eux.

6

PEP 8 recommande que toutes les importations se produisent en haut du module. Tous les noms, y compris ceux liés aux modules, sont recherchés dans les étendues locales, non locales, globales et intégrées, dans cet ordre.

+0

+1 pour PEP8. Le [module pep8] (http://pypi.python.org/pypi/pep8) vérifie votre code par rapport aux directives PEP8. –

Questions connexes