how do I write a scliceable class?
Ernest Adrogué
eadrogue at gmx.net
Sat Feb 13 09:53:20 EST 2010
Hi,
Thanks a lot for your comments. I think I've got enough
information to make a decision now.
13/02/10 @ 15:16 (+0100), thus spake Peter Otten:
> Ernest Adrogué wrote:
>
> > I'm designing a container class that supports slicing.
> > The problem is that I don't really know how to do it.
> >
> > class MyClass(object):
> > def __init__(self, input_data):
> > self._data = transform_input(input_data)
> > def __getitem__(self, key):
> > if isinstance(key, slice):
> > # return a slice of self
> > pass
> > else:
> > # return a scalar value
> > return self._data[key]
> >
> > The question is how to return a slice of self.
> > First I need to create a new instance... but how? I can't
> > use MyClass(self._data[key]) because the __init__ method
> > expects a different kind of input data.
> >
> > Another option is
> >
> > out = MyClass.__new__(MyClass)
> > out._data = self._data[key]
> > return out
> >
> > But then the __init__ method is not called, which is
> > undesirable because subclasses of this class might need
> > to set some custom settings in their __init__ method.
> >
> > So what is there to do? Any suggestion?
>
> Either
>
> (1) make transform_input() idempotent, i. e. ensure that
>
> transform_input(transform_input(data)) == transform_input(data)
>
> and construct the slice with MyClass(self._data[key])
>
> or
>
> (2) require it to be invertible with
>
> inverse_transform_input(transform_input(data)) == data
>
> and make the slice with MyClass(inverse_transform_input(self._data[key]))
>
> Just stating the obvious...
>
> Peter
> --
> http://mail.python.org/mailman/listinfo/python-list
More information about the Python-list
mailing list