[ZODB-Dev] Towards ZODB on Python 3

Tres Seaver tseaver at palladion.com
Sun Mar 10 16:13:31 UTC 2013


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 03/10/2013 11:55 AM, Jim Fulton wrote:
> On Sun, Mar 10, 2013 at 11:25 AM, Tres Seaver <tseaver at palladion.com>
> wrote:
>> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
>> 
>> On 03/10/2013 09:19 AM, Jim Fulton wrote:
> ...
>>> I think the fix is pretty straightforward.
>>> 
>>> In the default __setstate__ provided by Persistent, and when
>>> loading non-persistent instances:
>>> 
>>> - On Python 2, ASCII encode unicode attribute names.
>>> 
>>> - On Python 3, ASCII decode byte attribute names.
>>> 
>>> The same transformation is necessary when looking up global
>>> names.
>> 
>> Hmm, if zodbpickle has to handle the issue for non-persistent
>> instances and global names, wouldn't it be simpler to make it handle
>> persistent instances too?
> 
> No.  It can't know when a key is going to be used for a persistent
> attribute name.
> 
>> It can examine the stack inside 'load_dict' to figure out that the
>> context is an instance, right?
> 
> Ugh.  What stack?

The one where the unpickler keeps its work-in-progress?

 static int
 load_none(UnpicklerObject *self)
 {
     PDATA_APPEND(self->stack, Py_None, -1);
     return 0;
 }

 static int
 load_dict(UnpicklerObject *self)
 {
     PyObject *dict, *key, *value;
     Py_ssize_t i, j, k;

     if ((i = marker(self)) < 0)
         return -1;
     j = Py_SIZE(self->stack);

     if ((dict = PyDict_New()) == NULL)
         return -1;

     for (k = i + 1; k < j; k += 2) {
         key = self->stack->data[k - 1];
         value = self->stack->data[k];
         if (PyDict_SetItem(dict, key, value) < 0) {
             Py_DECREF(dict);
             return -1;
         }
     }
     Pdata_clear(self->stack, i);
     PDATA_PUSH(self->stack, dict, -1);
     return 0;
 }



> It would be much simpler to handle this in __setstate__ (or the
> equivalent). This isn't exactly a lot of code.

Again, if we have to deal with non-persistent / global names inside the
pickler anyway, then why not do the same for persistent ones?



Tres.
- -- 
===================================================================
Tres Seaver          +1 540-429-0999          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with undefined - http://www.enigmail.net/

iEYEARECAAYFAlE8sSoACgkQ+gerLs4ltQ7veQCg1wIhHOo93Z3z3NTVG3tesJnS
GLAAoL5XNrzOR5oucmPcpDSNE3QJ7Kb9
=YUjX
-----END PGP SIGNATURE-----



More information about the ZODB-Dev mailing list