[Python-Dev] python2.7 infinite recursion when loading pickled object

Akira Li 4kir4.1i at gmail.com
Mon Aug 11 15:01:31 CEST 2014


"Schmitt  Uwe (ID SIS)" <uwe.schmitt at id.ethz.ch> writes:

> I discovered a problem using cPickle.loads from CPython 2.7.6.
>
> The last line in the following code raises an infinite recursion
>
>     class T(object):
>
>         def __init__(self):
>             self.item = list()
>
>         def __getattr__(self, name):
>             return getattr(self.item, name)
>
>     import cPickle
>
>     t = T()
>
>     l = cPickle.dumps(t)
>     cPickle.loads(l)
...
> Is this a bug or did I miss something ?

The issue is that your __getattr__ raises RuntimeError (due to infinite
recursion) for non-existing attributes instead of AttributeError. To fix
it, you could use object.__getattribute__:

  class C:
    def __init__(self):
        self.item = []
    def __getattr__(self, name):
        return getattr(object.__getattribute__(self, 'item'), name)

There were issues in the past due to {get,has}attr silencing
non-AttributeError exceptions; therefore it is good that pickle breaks
when it gets RuntimeError instead of AttributeError.


--
Akira



More information about the Python-Dev mailing list