Dynamic class problem

Fredrik Lundh fredrik at pythonware.com
Tue Jun 5 20:22:03 EDT 2001


Robin Becker wrote:
> I'm trying to figure out how to recode a class that is giving a shadow
> warning under 2.1

I don't have the mental bandwidth to figure out what you're
doing here, but I can explain why you're getting that error:

> the relevant code is
>
>     def __getitem__(self, index):
>         try:
>             return self._children[index]
>         except KeyError:
>             Klass = self._prototype

here, you create a local variable named "Klass".

>             if Klass in _ItemWrapper.keys():

(you meant _ItemWrapper.has_key(Klass), didn't you?)

>                 WKlass = _ItemWrapper[Klass]
>             else:
>                 class WKlass(Klass):

here, you refer to that local variable.

>                     def __getattr__(self,name):
>                         try:
>                             return Klass.__getattr__(self,name)

here, you access a *global* variable named Klass.  under 2.2,
this will refer to the local variable instead.

>                         except:
>                             return getattr(self._parent,name)
>                 _ItemWrapper[Klass] = WKlass
>
>             child = WKlass()
>             child._parent = self
>             for i in filter(lambda x,K=child.__dict__.keys(): x in K,child._attrMap.keys()):
>                 del child.__dict__[i]
>
>             self._children[index] = child
>             return child
>
> the idea is that I want to generate a child instance based on the _prototype class
> which has a single overridden getattr method. This code seemed to be working in 2.0,
> but I'm getting warnings now

do you have a global Klass class?  if not, 2.1 just pointed out that
your code didn't always work...

Cheers /F





More information about the Python-list mailing list