2010-08-11 2 views
1

Ce que je veux, c'est que foo.py importe des classes de bar1, bar2, et ils ont tous deux besoin de bar3, par exemple.Python important des modules qui importent tous un autre module identique

foo.py

from src import * 
... 

src/__ init__.py

from bar1 import specialSandwichMaker 
from bar2 import specialMuffinMaker 

src/bar1.py

import bar3 
class specialSandwichMaker(bar3.sandwichMaker) 
... 

src/bar2.py

import bar3 
class specialMuffinMaker(bar3.muffinMaker) 
... 

Y at-il un moyen plus efficace de rendre bar3 disponible pour les fichiers bar1 et bar2 sans les importer directement?

+0

Une exception à la règle 'foo importation *' que vous attrapez juste au sujet Flack est si chaque élément 'foo' se termine ou commence dans un nom qui est unique à 'foo'. par exemple, définissez un module 'exceptions' et toutes les exceptions se terminent par Error. Ensuite, vous pouvez simplement faire 'à partir d'exceptions import *' et avoir toutes vos exceptions prêtes à 'raise' ou 'except'. sachez cependant que si vous rechargez le module, les classes importées de cette manière ne seront pas rechargées avec __not__. – aaronasterling

Répondre

5

Ceci est entièrement efficace; lors de l'importation d'un module Python l'ajoutera à sys.modules. Les instructions import vérifient d'abord ce dictionnaire (ce qui est rapide car les recherches dans les dictionnaires sont rapides) pour voir si le module a déjà été importé. Dans ce cas, bar1 va importer bar3 et l'ajouter à sys.modules. Ensuite bar2 utilisera le bar3 déjà importé.

Vous pouvez vérifier cela avec:

import sys 
print(sys.modules) 

Notez que from src import * est mauvais code et vous ne devriez pas l'utiliser. Soit import src et utilisent les références src.specialSandwichMaker, soit from src import specialSandwichMaker. Cela est dû au fait que les modules ne doivent pas polluer les espaces de noms des autres - si vous faites from src import *, toutes les variables globales définies dans src apparaîtront également dans votre espace de noms. C'est mauvais.

+0

merci, si je fais un de src import *, cela prend-il seulement des globals du fichier __init__? ou va-t-il prendre des globals d'autres modules dans src \? – biokiwi

+0

Il est documenté ci-dessous. Si vous avez défini '__all__' dans' __init __. Py', cela prendra tout cela. Si ce n'est pas le cas, il ne faudra que ceux qui sont explicitement importés. Mais c'est une solution de contournement pour ceux qui utilisent 'import *'; tu ne devrais pas faire ça. – katrielalex

Questions connexes