[ python-Bugs-718532 ] inspect, class instances and __getattr__

SourceForge.net noreply at sourceforge.net
Sat Sep 9 15:14:53 CEST 2006


Bugs item #718532, was opened at 2003-04-10 01:31
Message generated for change (Comment added) made by baijum81
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=718532&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Python Library
Group: Python 2.4
Status: Open
Resolution: None
Priority: 6
Submitted By: Stefan Schwarzer (sschwarzer)
Assigned to: Ka-Ping Yee (ping)
Summary: inspect, class instances and __getattr__

Initial Comment:
inspect.isclass(class_instance) fails if the
corresponding class uses a "wildcard" implementation of
__getattr__.

Example:

Python 2.2.2 (#1, Nov 13 2002, 22:53:57) 
[GCC 2.95.4 20020320 [FreeBSD]] on freebsd4
Type "help", "copyright", "credits" or "license" for
more information.
>>> import inspect
>>> class X:
...     def __getattr__(self, name):
...             if name == 'foo':
...                     return 1   
...             if name == 'bar':
...                     return 2
...             else:
...                     return "default"
... 
>>> x = X()
>>> inspect.isclass(x)
1

The problematic expression in inspect.isclass is
hasattr(object, '__bases__') which returns a true value.

----------------------------------------------------------------------

Comment By: Baiju M (baijum81)
Date: 2006-09-09 18:44

Message:
Logged In: YES 
user_id=565450

Due to this bug, 'pydoc modulename' is not working.
pydoc tries to access __name__ attribute of classes,
so it raises attribute error. (actually it is not a class,
but an instance only).
So please increase the priority of this bug.

And this case is also not working (same issue):

class X:
  __bases__ = ()

x = X()


----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2005-08-24 10:55

Message:
Logged In: YES 
user_id=80475

Ping, do you have a few minutes to look at this one and make
sure its the right thing to do.

----------------------------------------------------------------------

Comment By: Facundo Batista (facundobatista)
Date: 2005-05-31 00:45

Message:
Logged In: YES 
user_id=752496

Don't know yet if it's a bug or not, but in Py2.4.1
inspect.isclass() is still returning True in these cases...

----------------------------------------------------------------------

Comment By: Stefan Schwarzer (sschwarzer)
Date: 2005-01-28 22:14

Message:
Logged In: YES 
user_id=383516

Hi Facundo

The problem still exists in both Python 2.3.4 and 2.4.

A possible test case is:

import inspect
import unittest

class TestIsclass(unittest.TestCase):
    def test_instance_with_getattr(self):
        class Cls:
            def __getattr__(self, name):
                return "not important"
        obj = Cls()
        # obj is not a class
        self.failIf(inspect.isclass(obj))


----------------------------------------------------------------------

Comment By: Facundo Batista (facundobatista)
Date: 2005-01-15 23:20

Message:
Logged In: YES 
user_id=752496

Please, could you verify if this problem persists in Python 2.3.4
or 2.4?

If yes, in which version? Can you provide a test case?

If the problem is solved, from which version?

Note that if you fail to answer in one month, I'll close this bug
as "Won't fix".

Thank you! 

.    Facundo

----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-04-15 16:10

Message:
Logged In: YES 
user_id=80475

Ping, if this change is made, will isclass() still be able to 
find extension classes?

The addition of the hasattr(object, '__bases__') was made 
by you in ver 1.11 about two years ago. 


----------------------------------------------------------------------

Comment By: Walter Dörwald (doerwalter)
Date: 2003-04-15 15:31

Message:
Logged In: YES 
user_id=89016

type(object) in (types.TypeType, types.ClassType)
won't work with custom metaclasses.
isinstance(object, (type, types.ClassType))
would be better.


----------------------------------------------------------------------

Comment By: Stefan Schwarzer (sschwarzer)
Date: 2003-04-15 13:31

Message:
Logged In: YES 
user_id=383516

Hello Raymond, thanks for your reply. In fact, I'm also not
sure if it counts as a bug. I also suggested a patch (handle
__getattr__ requests for __bases__ with an AttributeError)
for for the SF project which causes/d the problem.

I think, if there's a better way to decide on "class-ness"
than now, the code in inspect should be changed.
Fortunately, it doesn't have to be backward-compatible,
because the module is always distributed with a certain
interpreter version.

----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-04-15 06:06

Message:
Logged In: YES 
user_id=80475

Hmm.  I'm not sure that counts as a bug.  In an OO 
language, it's a feature that objects can be made to look 
like and be substituable for other types.  In this case, 
you've taught your object to be able to fake some classlike 
behavior (having a __bases__ attribute).

OTOH, inspect could have a stronger test for classhood:    
type(object) in (types.TypeType, types.ClassType)

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=718532&group_id=5470


More information about the Python-bugs-list mailing list