Why does built-in set not take keyword arguments?
Serge Orlov
Serge.Orlov at gmail.com
Thu May 4 18:45:31 EDT 2006
Jack Diederich wrote:
> On Thu, May 04, 2006 at 02:08:30PM -0400, Steven Watanabe wrote:
> > I'm trying to do something like this in Python 2.4.3:
> >
> > class NamedSet(set):
> > def __init__(self, items=(), name=''):
> > set.__init__(self, items)
> > self.name = name
> >
> > class NamedList(list):
> > def __init__(self, items=(), name=''):
> > list.__init__(self, items)
> > self.name = name
> >
> > I can do:
> >
> > >>> mylist = NamedList(name='foo')
> >
> > but I can't do:
> >
> > >>> myset = NamedSet(name='bar')
> > TypeError: set() does not take keyword arguments
> >
> > How come? How would I achieve what I'm trying to do?
>
> setobject.c checks for keyword arguments in it's __new__ instead
> of its __init__. I can't think of a good reason other to enforce
> inheriters to be maximally set-like. We're all adults here so
> I'd call it a bug. bufferobect, rangeobject, and sliceobject all
> do this too, but classmethod and staticmethod both check in tp_init.
> Go figure.
>
> As a work around use a function to make the set-alike.
>
> class NamedSet(set): pass
>
> def make_namedset(vals, name):
> ob = NamedSet(vals)
> ob.name = name
> return ob
>
> Then make_namedset as a constructor in place of NamedSet(vals, name)
Or use this work around:
class NamedSet(set):
def __new__(cls, iterable=(), name=""):
return super(NamedSet, cls).__new__(cls)
def __init__(self, iterable=(), name=""):
super(NamedSet, self).__init__(iterable)
self.name = name
More information about the Python-list
mailing list