Question

Ceci est un cas normal d'importation mutuelle. Supposons que vous avez la configuration suivante

./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 sont une seule fois. Dans Grok, cela ne se produit pas. Supposons avoir le app.py suivant

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 cas et le second est que le premier montre l'importation progressive de e puis de m. Dans le second cas, il importe directement m.

Merci pour l'aide

Était-ce utile?

La solution

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 () en m, et vérifier la trace de la pile pour voir ce qui importe les modules.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top