2009-10-07 11 views
0

Ceci est un cas normal d'importation mutuelle. Supposons que vous ayez la mise en page suivanteDouble importation dans grok

./test.py 
./one 
./one/__init__.py 
./one/two 
./one/two/__init__.py 
./one/two/m.py 
./one/two/three 
./one/two/three/__init__.py 
./one/two/three/four 
./one/two/three/four/__init__.py 
./one/two/three/four/e.py 
./one/two/u.py 

Et vous avez

test.py

from one.two.three.four import e 

un/deux/trois/quatre/e.py

from one.two import m 

un/deux/m.py

print "m" 
import u 

un/deux/u.py

print "u" 
import m 

Lorsque vous exécutez le programme test.py, vous vous attendez, bien sûr:

python test.py 
m 
u 

Quel est le comportement attendu. Les modules ont déjà été importés, et ils ne sont qu'une seule fois. Dans Grok, cela n'arrive pas. Supposons d'avoir la app.py suivante

import os; import sys; sys.path.insert(1,os.path.dirname(os.path.realpath(__file__))) 
import grok 
from one.two.three.four import e 

class Sample(grok.Application, grok.Container): 
    pass 

ce que vous obtenez lorsque vous exécutez Paster est:

$ bin/paster serve parts/etc/deploy.ini 
2009-10-07 15:26:57,154 WARNING [root] Developer mode is enabled: this is a security risk and should NOT be enabled on production servers. Developer mode can be turned off in etc/zope.conf 
m 
u 
m 
u 

Qu'est-ce qui se passe ici?

à partir d'une trace de pile pdb, les deux cas sont importés par martian:

/Users/sbo/.buildout/eggs/martian-0.11-py2.4.egg/martian/core.py(204)grok_package() 
    -> grok_module(module_info, grokker, **kw)            
    /Users/sbo/.buildout/eggs/martian-0.11-py2.4.egg/martian/core.py(209)grok_module() 
    -> grokker.grok(module_info.dotted_name, module_info.getModule(),      
    /Users/sbo/.buildout/eggs/martian-0.11-py2.4.egg/martian/scan.py(118)getModule()  
    -> self._module = resolve(self.dotted_name)            
    /Users/sbo/.buildout/eggs/martian-0.11-py2.4.egg/martian/scan.py(191)resolve()  
    -> __import__(used)                  

La seule différence entre le premier boîtier et le second est que le premier représente l'importation progressive de e et de m. Dans le second cas, il importe directement m.

Merci pour l'aide

+0

Est-ce que grok fait un rechargement automatique du code? La même chose se produit dans Werkzeug quand use_reloader = True. –

+0

Oui, mais pas dans mon cas. vous devez ajouter un commutateur spécifique pour effectuer le rechargement, et dans tous les cas cela n'expliquerait pas la persistance des données. –

Répondre

0

Cela pourrait peut-être un effet secondaire de l'introspection ne Grok, je ne suis pas sûr.

Essayez de mettre un pdb.set_trace() dans m, et vérifiez la trace de la pile pour voir ce qui importe les modules.

+0

Il semble que cela soit dû à ma stratégie d'importation du paquet. Je travaille autour de ça, mais c'est quand même un comportement plutôt anormal. Je l'ai trouvé parce que l'un des modules pousse une entrée dans un dict qui augmente si un doublon est introduit, et quand la deuxième importation se produit, j'obtiens une exception. –