Why does pickle use eval for loading string values?
Mike C. Fletcher
mcfletch at rogers.com
Thu Jan 10 23:55:43 EST 2002
>>> b = '"this \\" there"'
>>> eval( b)
'this " there'
>>> b[1:-1]
'this \\" there'
>>>
That is, if you're storing the string in a format for eval, then you're
_not_ formatting it for restore from [1:-1]. Because of that the change
would be backward incompatible with every previous version of
pickle/cPickle.
HTH,
Mike
Brian Kelley wrote:
> Here's something I never quite understood. pickle and cPickle use eval
> to load string values. This seems fairly neat but why is it necessary?
>
> One fairly serious drawback is that the eval interns the string values
> which means that they can never get garbage collected. This has been a
> problem for some of my applications (you can do a google search for
> pickle and intern to see an old thread on this)
>
> I replaced load_string in pickle with the following:
>
> self.append(rep[1:-1])
>
> initially the loader was
>
> self.append(eval(rep,
> {'__builtins__': {}})) # Let's be careful
>
> I applied the same thing to cPickle.
>
> This appears to be slightly faster and doesn't have the intern problem
> mentioned above.
>
> So what am I missing? Is there some reason why eval should be used?
>
> I'm tempted to report this as a bug in pickle since interning strings is
> a undocumented side-effect. The fix seems easy so please shoot my down
> if I'm being niave.
>
> Brian Kelley
> Whitehead Institute for Biomedical Research
>
--
_______________________________________
Mike C. Fletcher
http://members.rogers.com/mcfletch/
More information about the Python-list
mailing list