[Checkins] SVN: zodbupdate/trunk/src/zodbupdate/serialize.py Improve yesterday code.

Sylvain Viollon sylvain at infrae.com
Thu Oct 7 04:55:25 EDT 2010


Log message for revision 117320:
  Improve yesterday code.
  

Changed:
  U   zodbupdate/trunk/src/zodbupdate/serialize.py

-=-
Modified: zodbupdate/trunk/src/zodbupdate/serialize.py
===================================================================
--- zodbupdate/trunk/src/zodbupdate/serialize.py	2010-10-07 08:44:49 UTC (rev 117319)
+++ zodbupdate/trunk/src/zodbupdate/serialize.py	2010-10-07 08:55:24 UTC (rev 117320)
@@ -34,14 +34,13 @@
 def create_broken_module_for(symb):
     """If your pickle refer a broken class (not an instance of it, a
        reference to the class symbol itself) you have no choice than
-       having this module available in the same module and with the
+       having this module available in the same symbol and with the
        same name, otherwise repickling doesn't work (as both pickle
        and cPikle __import__ the module, and verify the class symbol
-       is the same).
+       is the same than the one provided).
     """
     parts = symb.__module__.split('.')
-    previous_module = None
-    previous_name = None
+    previous = None
     for fullname, name in reversed(
         [('.'.join(parts[0:p+1]), parts[p]) for p in range(1, len(parts))]):
         if fullname not in sys.modules:
@@ -52,18 +51,20 @@
                 module.__path__ = []
                 known_broken_modules[fullname] = module
             else:
-                module = known_broken_modules[fullname]
-            if previous_module and previous_name:
-                setattr(module, previous_name, previous_module)
-            previous_module = module
-            previous_name = name
+                if previous:
+                    module = known_broken_modules[fullname]
+                    setattr(module, *previous)
+                break
+            if previous:
+                setattr(module, *previous)
+            previous = (name, module)
         else:
-            if previous_module and previous_name:
-                setattr(sys.modules[fullname], previous_name, previous_module)
+            if previous:
+                setattr(sys.modules[fullname], *previous)
                 break
     if symb.__module__ in known_broken_modules:
         setattr(known_broken_modules[symb.__module__], symb.__name__, symb)
-    else:
+    elif symb.__module__ in sys.modules:
         setattr(sys.modules[symb.__module__], symb.__name__, symb)
 
 
@@ -269,7 +270,7 @@
             pickler.dump(class_meta)
             pickler.dump(data)
         except cPickle.PicklingError, error:
-            logger.error('Error while pickling modified record: %s' % error)
+            logger.error('Error: cannot pickling modified record: %s' % error)
             # Could not pickle that record, skip it.
             return None
 



More information about the checkins mailing list