Двойной импорт в грок - PullRequest
       15

Двойной импорт в грок

0 голосов
/ 07 октября 2009

Это нормальный случай взаимного импорта. Предположим, у вас есть следующий макет

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

И у вас есть

test.py

 from one.two.three.four import e

один / два / три / четыре / e.py

from one.two import m

один / два / m.py

print "m"
import u

один / два / u.py

print "u"
import m

Когда вы запускаете программу test.py, вы, конечно, ожидаете:

python test.py
m
u

Какое поведение ожидается? Модули уже были импортированы, и они есть только один раз. В Гроке такого не бывает. Предположим, у вас есть следующий 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

то, что вы получаете, когда запускаете 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

Что здесь происходит?

из трассировки стека pdb, оба случая импортируются по-марсиански:

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

Единственная разница между первым случаем и вторым состоит в том, что первый показывает прогрессивный импорт e, а затем m. Во втором случае он напрямую импортирует m.

Спасибо за помощь

1 Ответ

0 голосов
/ 07 октября 2009

Возможно, это побочный эффект интроспекции, которую проводит Грок, я не уверен.

Попробуйте поместить pdb.set_trace () в m и проверить трассировку стека, чтобы увидеть, что импортирует модули.

...