[Python-Dev] Changing existing class instances

Guido van Rossum guido@CNRI.Reston.VA.US
Thu, 20 Jan 2000 15:02:20 -0500


> [Tim worries about stomping on unintended classes/defs]
> 
> [Guido]
> > Agreed that that would be bad.  But I wouldn't search outer
> > scopes -- I would only look for a class/def that I was about
> > to stomp on.
> 
> Maybe I just don't grasp what that means, exactly.  Fair enough, since I'm
> not expressing myself clearly either!
> 
> Suppose someone does
> 
> from Tkinter import *
> 
> in my.py, and later in my.py just *happens* to define, at module level,
> 
> class Misc:
>     blah blah blah
> 
> Now Misc was already in my.py's global namespace because Tkinter.py just
> happens to export a class of that name too (more by accident than design --
> but accidents are what I'm most worried about here).

For a second I thought you got me there!

> At the time my.py defines Misc, does Misc count as a class we're "about to
> stomp on"?  If so-- & I've assumed so --it would wreak havoc.
> 
> But if not, I don't see how this case can be reliably distinguished "by
> magic" from the cases where update is desired (if people are doing dynamic
> updates to a long-running program, a new version of a class can come from
> anywhere, so nothing like original file name or line number can distinguish
> correctly either).

Fortunately, there's magic available: recently, all classes have a
__module__ attribute that is set to the full name of the module that
defined it (its key in __sys__.modules).

For functions, we would have to invent something similar.

> >> Modules differ because their namespace "search path"
> >> consists solely of the more-global-than-global <wink>
> >> sys.modules.
> 
> > "The search path doesn't enter into it."
> 
> I agree, but am at a loss to describe what's happening in the case above
> using other terminology <wink>.  In a sense, you need a system-wide "unique
> handle" to support bulletproof updating, and while sys.modules has supplied
> that all along for module objects (in the form of the module name), I don't
> believe there's anything analogous to key off of for function or class
> objects.
> 
> >>    [suggesting]
> >>    new.update(class_or_def_old, class_or_def_new)
> 
> > Only a slight semantics change (which my full proposal
> > would require too): function objects would become mutable
> > -- their func_code, func_defaults, func_doc and func_globals
> > fields (and, why not, func_name too) should be changeable.
> 
> Of course I meant "no new semantics" in the sense of "won't cause current
> exception-free code to alter behavior in any way".
> 
> > If you make all these assignable, it doesn't even have to
> > be a privileged function.
> 
> I'm all for that!
> 
> > [sketching a Python approach to "updating import/reload"
> >  building on the hypothetical new.update]
> 
> > That's certainly a reasonable compromise.  Note that the
> > update on a class should imply an update on its methods,
> > right?
> 
> Hadn't considered that!  Of course you're right.  So make it a pair of
> nested loops <wink>.
> 
> so-long-as-it-can-be-written-in-python-it's-easy-ly
>     y'rs  - tim

--Guido van Rossum (home page: http://www.python.org/~guido/)