Is a Borg rebellion possible? (a metaclass question)

André andre.roberge at gmail.com
Fri Sep 7 15:15:04 EDT 2007


On Sep 7, 4:00 pm, Carsten Haese <cars... at uniqsys.com> wrote:
> On Fri, 2007-09-07 at 15:54 +0000, André wrote:
> > Unfortunately, it fails.  Here's what I tried, followed by the
> > traceback
> > class SplinterBorg(object):
> >     _shared_states = {}
> >     def __new__(cls, *a, **k):
> >         group = k.pop("group","BORG")
> >         obj = object.__new__(cls, *a, **k)
> >         obj.__dict__ = cls._shared_states.setdefault(group,{})
> >         return obj
>
> > class MyClass(SplinterBorg):
> >    def __init__(self, name):
> >        self.name = name
> >[...]
> > Traceback (most recent call last):
> >   File "test.py", line 15, in <module>
> >     b1 = MyClass('b', group="B")
> > TypeError: __init__() got an unexpected keyword argument 'group'
>
> Indeed, if you have an __init__ method that shouldn't see the "group"
> argument, you need a metaclass after all so you can yank the "group"
> argument between __new__ and __init__. The following code seems to work,
> but it's making my brain hurt:
>
> class SplinterBorgMeta(type):
>     def __call__(cls, *args, **kwargs):
>         inst = cls.__new__(cls, *args, **kwargs)
>         kwargs.pop("group",None)
>         inst.__init__(*args,**kwargs)
>         return inst
>
> class SplinterBorg(object):
>     __metaclass__ = SplinterBorgMeta
>     _shared_states = {}
>     def __new__(cls, *a, **k):
>         group = k.pop("group","BORG")
>         obj = object.__new__(cls, *a, **k)
>         obj.__dict__ = cls._shared_states.setdefault(group,{})
>         return obj
>
> class MyClass(SplinterBorg):
>     def __init__(self, name):
>        self.name = name
>
> The alternatives, as Steve just pointed out, would be not to subclass
> SplinterBorg or to provide an __init__ method that expects a "group"
> argument.
>
> HTH,
>

Thanks for your reply.  I will try to adapt it and see if it works in
my case.

André

> --
> Carsten Haesehttp://informixdb.sourceforge.net





More information about the Python-list mailing list