Pergunta

Este é um caso normal de importação mútua. Suponha que você tenha o seguinte layout

./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

E você tem

test.py

 from one.two.three.four import e

um/dois/três/quatro/e.py

from one.two import m

um/dois/m.py

print "m"
import u

um/dois/u.py

print "u"
import m

Quando você executa o programa test.py, você espera, é claro:

python test.py
m
u

Qual é o comportamento esperado. Os módulos já foram importados e são apenas uma vez. Em Grok, isso não acontece. Suponha ter o seguinte app.py

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

O que você obtém quando você administra o Paster:

$ 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

O que está acontecendo aqui?

De um rastreamento de pilha PDB, ambos os casos são importados por marcianos:

    /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)                                                                    

A única diferença entre o primeiro caso e a segunda é que o primeiro mostra a importação progressiva de e e depois de m. No segundo caso, ele importa diretamente m.

Obrigado pela ajuda

Foi útil?

Solução

Isso poderia ser um efeito colateral da introspecção que Grok faz, não tenho certeza.

Tente colocar um pdb.set_trace () em m e verifique o rastreamento da pilha para ver o que está importando os módulos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top