From: Greg W. <gw...@me...> - 2002-02-26 21:40:51
|
Has anyone had any luck running Pychecker on a ZODB application? The problem, I suspect, is that ZODB does some evil magic at import time, and that disagrees with Pychecker. Actually, it disagrees with a lot of tools, and I have learned that the usual solution is to manually "import ZODB" before doing anything else. With Pychecker, this didn't help much. Illustration: mems.lib.database is the heart of our application; in a nutshell, everything in our system imports mems.lib.database, and mems.lib.database imports almost nothing except ZODB. So that seemed like a logical place to start running pychecker, at least as long as pychecker insists on checking code in modules other than the one you ask it to check. But things get hairy just pychecking mems.lib.database. With my patch #523136 applied to pychecker, I get this: $ pychecker mems.lib.database Processing mems.lib.database... Caught exception importing module mems.lib.database: File "/home/gward/bin/pychecker", line 422, in load() return self.initModule(self.setupMainCode()) File "/home/gward/bin/pychecker", line 459, in setupMainCode() module = imp.load_module(self.moduleName, file, filename, smt) File "/www/mxpython/mems/lib/database.py", line 12 from ZODB import DB File "lib.linux-i686-2.2/ZODB/__init__.py", line 32 KeyError: ZODB Warnings... mems.lib.database:1: NOT PROCESSED UNABLE TO IMPORT Here's a possibly-relevant snippet of ZODB/__init__.py, line numbers courtesy of "cat -n": 13 import sys, ExtensionClass, TimeStamp, cPersistence, Persistence 14 import cStringIO, cPickle 15 from zLOG import register_subsystem 16 register_subsystem('ZODB') 17 18 # This is lame. Don't look. :( 19 sys.modules['cPersistence']=cPersistence 20 21 Persistent=cPersistence.Persistent 22 23 # Install Persistent and PersistentMapping in Persistence 24 if not hasattr(Persistence, 'Persistent'): 25 Persistence.Persistent=Persistent 26 Persistent.__module__='Persistence' 27 Persistence.Overridable=cPersistence.Overridable 28 Persistence.Overridable.__module__='Persistence' 29 if not hasattr(Persistence, 'PersistentMapping'): 30 import PersistentMapping 31 sys.modules['PersistentMapping']=PersistentMapping 32 sys.modules['BoboPOS']=sys.modules['ZODB'] ^^^^^^ It's pretty clear where the KeyError is coming from. It's not clear why it's happening: perhaps Pychecker's import fails to emulate Python's exactly? Ie. from the code, I presume that Python sets sys.modules['ZODB'] before starting to execute the code in ZODB/__init__.py, but Pychecker does not. Is this correct? If so, would it be easy to fix? Off for more investigating -- would appreciate any tips or hints! Greg -- Greg Ward - software developer gw...@me... MEMS Exchange http://www.mems-exchange.org |