Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > weird isinstance/issubclass behavior?

Reply
Thread Tools

weird isinstance/issubclass behavior?

 
 
lars van gemerden
Guest
Posts: n/a
 
      11-29-2012
Hi,

I have encountered some strange behavior of isinstance(/issubclass): depending on the import path used for classes i get different output, while the classes i compare are in the same file.

Basically if i import a class as:

from mod1.mod2 import A

or:

from mod0.mod1.mod2 import A

which both result in importing the same class, a call to isinstance(inst, A) in another module can have a different output. In this module

print type(inst), A, isinstance(inst, A), issubclass(type(inst), A)

gives:

<class 'mod0.mod1.mod2.A'> <class 'mod1.mod2.A'> False False

resp.

<class 'mod0.mod1.mod2.A'> <class 'mod0.mod1.mod2.A'> True True

which seems somewhat logical, but in my case a strange gotcha. My question is:
Is this intended, inevitable or a bug?

Cheers, Lars

PS: this is somewhat simpler than the actual case i've encountered, and i haven't tested this exact case, but for now i hope this is enough to get some of your insight.
 
Reply With Quote
 
 
 
 
Chris Angelico
Guest
Posts: n/a
 
      11-29-2012
On Fri, Nov 30, 2012 at 1:59 AM, lars van gemerden <(E-Mail Removed)> wrote:
> Basically if i import a class as:
>
> from mod1.mod2 import A
>
> or:
>
> from mod0.mod1.mod2 import A
>
> which both result in importing the same class, a call to isinstance(inst, A) in another module can have a different output.


What you may be seeing there is that you've imported the module twice.
There are two entirely separate module objects, taken from the same
file. Something instantiated from one class isn't an instance of the
other class even if they're indistinguishable classes; a little
monkeypatching might show you what's going on (fiddle with one class,
check the other, fiddle hasn't happened).

As a general rule, importing a module in different ways is considered
dangerous. Be consistent, and then this sort of oddity won't occur -
and you also won't have other oddities, eg with other global state.

ChrisA
 
Reply With Quote
 
 
 
 
lars van gemerden
Guest
Posts: n/a
 
      11-29-2012
On Thursday, November 29, 2012 3:59:37 PM UTC+1, lars van gemerden wrote:
> Hi,
>
>
>
> I have encountered some strange behavior of isinstance(/issubclass): depending on the import path used for classes i get different output, while the classes i compare are in the same file.
>
>
>
> Basically if i import a class as:
>
>
>
> from mod1.mod2 import A
>
>
>
> or:
>
>
>
> from mod0.mod1.mod2 import A
>
>
>
> which both result in importing the same class, a call to isinstance(inst, A) in another module can have a different output. In this module
>
>
>
> print type(inst), A, isinstance(inst, A), issubclass(type(inst), A)
>
>
>
> gives:
>
>
>
> <class 'mod0.mod1.mod2.A'> <class 'mod1.mod2.A'> False False
>
>
>
> resp.
>
>
>
> <class 'mod0.mod1.mod2.A'> <class 'mod0.mod1.mod2.A'> True True
>
>
>
> which seems somewhat logical, but in my case a strange gotcha. My question is:
>
> Is this intended, inevitable or a bug?
>
>
>
> Cheers, Lars
>
>
>
> PS: this is somewhat simpler than the actual case i've encountered, and i haven't tested this exact case, but for now i hope this is enough to get some of your insight.


I know for sure that the imports both import the same file, though if i understand you correctly, it creates 2 different module objects? Are module object only created on an import statement?

The 2 parameters of isinstance() follow a very different import path.

Anyway, to not spend too much time us this, i'll just file it under 'dangerous' and use the second import statement. It does solve my problem.

Thanks, Lars
 
Reply With Quote
 
Terry Reedy
Guest
Posts: n/a
 
      11-29-2012
On 11/29/2012 9:59 AM, lars van gemerden wrote:
> Hi,
>
> I have encountered some strange behavior of isinstance(/issubclass): depending on the import path used for classes i get different output, while the classes i compare are in the same file.
>
> Basically if i import a class as:
>
> from mod1.mod2 import A
> or:
> from mod0.mod1.mod2 import A
>
> which both result in importing the same class,


As other said, both import the same abstract class but create two
different concrete class objects.

> a call to isinstance(inst, A) in another module can have a different

output.
> In this module
> print type(inst), A, isinstance(inst, A), issubclass(type(inst), A)
> gives:
> <class 'mod0.mod1.mod2.A'> <class 'mod1.mod2.A'> False False


Add print id(type(inst)), id(A) and you will see that they are different
objects. The isinstance and issubclass calls compare the classes by
identity (the default meaning of ==) and so False, False are correct.

--
Terry Jan Reedy

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: A Weird Appearance for a Weird Site David Segall HTML 0 01-22-2011 04:50 AM
Re: A Weird Appearance for a Weird Site Beauregard T. Shagnasty HTML 1 01-21-2011 04:17 PM
Re: A Weird Appearance for a Weird Site richard HTML 0 01-21-2011 07:10 AM
Re: A Weird Appearance for a Weird Site dorayme HTML 1 01-21-2011 06:51 AM
Re: A Weird Appearance for a Weird Site richard HTML 0 01-21-2011 06:46 AM



Advertisments