Re: Backward compatibility of next beta

Derek Atkins <[email protected]>
Newsgroups gmane.comp.sysutils.backup.rdiff-backup.general
Message-ID <[email protected]>
Hi Frank,

Frank Crawford <[email protected]> writes:

> Okay, to get into the technical details, as I tracked them down, and
> there may be other issues over and above these, but much of the data
> between remote servers is passed in pickle format.
>
> One of the options in a pickle is to not just pass the data but the
> object, or more specifically the data and the function call to process
> that data.  These functions are essentially assumed to be the same
> function on both sides.  These functions are essentially looked up in
> the python symbol table.
>
> Unfortunately in Python2 the functions in the symbol table are in
> ascii, while in Python3 they are in unicode, and so the pickle data
> doesn't match on the lookup in the symbol table, and hence most objects
> passed between the two return a "function not found" error.
>
> Without somehow modifying the symbol table (which would probably break
> other things) you can't get around it, and you would need to modify it
> on both sides scripts.
>
> There are a number of other items like just the strings transition from
> ascii to unicode for the actual data needs to be fixed, on to new
> pickle formats available in Python3, that would be a headache, but they
> could be addressed.
>
> Unfortunately they are minor compared to the symbol table issue.

According to the docs I just found on class pickle.Pickler[0], there is
a fix_imports and Protocol version number in there that lets you set the
compatibility level:

    The optional protocol argument, an integer, tells the pickler to use
    the given protocol; supported protocols are 0 to
    HIGHEST_PROTOCOL. If not specified, the default is
    DEFAULT_PROTOCOL. If a negative number is specified,
    HIGHEST_PROTOCOL is selected.

    If fix_imports is true and protocol is less than 3, pickle will try
    to map the new Python 3 names to the old module names used in Python
    2, so that the pickle data stream is readable with Python 2.

SO..  It SHOULD be possible to create a pickle in Py3 that is readable
by Py2.  Have we tried this?

-derek

[0] https://docs.python.org/3/library/pickle.html#pickle.Pickler

-- 
       Derek Atkins                 617-623-3745
       [email protected]             www.ihtfp.com
       Computer and Internet Security Consultant
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.