Bug with super() and reload()?

Michael Hudson mwh at python.net
Thu Jan 16 09:50:26 EST 2003


Thomas Heller <theller at python.net> writes:

> I stumbled over the following problem with super() and reload().
> 
> Consider this module:
> 
> ---- file mod.py ----
> class X(object):
>     def test(self):
>         print "X.test"
> 
> class Y(X):
>     def test(self):
>         print "Y.test"
>         super(Y, self).test()
> ---- EOF ----
> 
> then, running this code:
> 
> ---- the script ----
> import mod
> 
> Y = mod.Y
> 
> reload(mod)
> 
> y = Y()
> y.test()
> ---- EOF ----
> 
> prints this traceback:
> 
>     Y.test
>     Traceback (most recent call last):
>       File "<stdin>", line 8, in ?
>       File "mod.py", line 8, in test
>         super(Y, self).test()
>     TypeError: super(type, obj): obj must be an instance or subtype of type

This is no different from this old chestnut:

>>> import mod
>>> y = mod.Y()
>>> reload(mod)
<module 'mod' from 'mod.pyc'>
>>> mod.Y.test(y)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: unbound method test() must be called with Y instance as first argument (got Y instance instead)

is it?

> Thinking hard, I can understand why this traceback occurs: The object
> 'y' is not an instance of the 'Y' refered to in the source code.

You had to think hard for that?  You can't use Python interactively
much...

> Should this be considered a bug, or is it simply a wart, and reload
> should be avoided?

Well, it's not gonna change anytime soon, so I guess it's a wart.

This may interest you:

    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/160164

I could rewrite it to frob __bases__ now, I guess.

Cheers,
M.

-- 
  /* I'd just like to take this moment to point out that C has all
     the expressive power of two dixie cups and a string.
   */                       -- Jamie Zawinski from the xkeycaps source




More information about the Python-list mailing list