2010-03-25 7 views
6

J'ai un paquet Python mymodule avec un sous-paquet utils (c'est-à-dire un sous-répertoire qui contient des modules ayant chacun une fonction). Les fonctions ont le même nom que le fichier/module dans lequel elles vivent.Importer une fonction/classe à partir d'un module Python du même nom

Je voudrais être en mesure d'accéder aux fonctions de la manière suivante,

from mymodule.utils import a_function

Étrangement cependant, parfois je peux importer des fonctions en utilisant la notation ci-dessus, cependant d'autres fois, je ne peux pas. Je n'ai pas réussi à comprendre pourquoi (récemment, par exemple, j'ai renommé une fonction et le fichier dans lequel il était et reflété ce renommer dans le fichier utils.__init__.py mais il n'est plus importé comme une fonction (plutôt comme un module) dans un de mes scripts.

Le utils.__init__.py lit quelque chose comme,

__all__ = ['a_function', 'b_function' ...] 
from a_function import a_function 
from b_function import b_function 
... 

mymodule.__init__.py n'a pas de référence à utils

Idées?

Répondre

7

vos utils fonctions doivent importer d'autres fonctions utilitaires? (ou importer d'autres modules qui importent d'autres fonctions d'utilitaires). Supposons par exemple que a_function.py contient "from mymodule.utils import b_function". Voici votre utils.py avec un tas de commentaires:

# interpreter is executing utils.py 
# Right now, utils.a_function and utils.b_function are modules 

# The following line executes the a_function module, 
# then rebinds a_function to a_function.a_function 
from a_function import a_function 

# The following line executes the b_function module, 
# then rebinds b_function to b_function.b_function 
from b_function import b_function 

Lorsque le module a_function est d'abord importé par utils.py, utils.b_function est un module pas une fonction. Tout module qui indique "from mymodule.utils import b_function" avant l'exécution de la dernière ligne se terminera par une référence au module b_function au lieu de la fonction b_function.

En général, je trouve que l'idiome from somemodule import something est lourde de dangers pour tout grand projet. C'est génial pour les scripts courts, mais une fois que vous commencez à introduire des dépendances d'importation circulaires, vous rencontrez des problèmes et devez faire attention à l'endroit où vous l'utilisez.

Comme un compromis entre la sécurité et l'économie sur la frappe, j'utiliserais from mymodule import utils puis appelez utils.a_function(). De cette façon, vous obtiendrez toujours l'objet lié à utils.a_functiondès maintenant au lieu de ce qui s'est passé pour être lié à utils.a_function lors de l'importation.

+0

Alors, quelle est la différence entre 'import mymodule.utils as utils' et' from mymodule import utils'? –

+0

@Mike DeSimone: Bon point. J'ai mis à jour ma réponse en conséquence. –

Questions connexes