New submission from Barry A. Warsaw:

I've been debugging a crash in nose 1.3.0, the root cause of which turned out 
to be an instance containing an attribute which itself was an instance of the 
following class (boiled down):

class Picky:
    def __getstate__(self):
        return {}
    def __getattr__(self, attr):
        return None

This crashes with a TypeError in Python 2.7 and Python 3 (albeit with slightly 
different tracebacks; and Python 3 is more difficult to debug because the 
TypeError doesn't include any useful information).

TypeError: 'NoneType' object is not callable

The culprit is __getattr__() returning None.  In Python 3 for example, pickle 
tries to get the object's __reduce_ex__() function and then call it.

The problem is the (IMHO) bogus __getattr__() and I'm not sure why nose has 
this.  But I wonder if the pickle documentation should warn against this kind 
of thing.

This isn't a bug in Python - the crash makes sense when you understand the 
implications, but perhaps a warning in the docs would have helped prevent this 
nose bug in the first place.  I suppose I could also see improving _pickle.c to 
provide some additional feedback on the offending attribute, but that's 
probably more difficult.

It's okay to close this as won't fix if we can't think of appropriate wording.  
It's enough that there's a record of this issue for search engines now.

----------
assignee: docs@python
components: Documentation
messages: 208108
nosy: barry, docs@python
priority: normal
severity: normal
status: open
title: Cannot pickle some objects that have a __getattr__()
versions: Python 2.7, Python 3.1, Python 3.2, Python 3.3, Python 3.4

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue20261>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to