On Thu, Dec 30, 2010 at 9:59 PM, Shai Berger <[email protected]> wrote: > > On Thursday 30 December 2010, Alon Levy wrote: > (edited against the top-posting) >> On Thu, Dec 30, 2010 at 7:42 AM, Shai Berger <[email protected]> wrote: >> > >> > class L(list): >> > def __getitem__(self, idx): >> > try: >> > i = iter(idx) >> > except TypeError: >> > return super(L, self).__getitem__(idx) >> > else: >> > return [self[ii] for ii in i] >> > >> Why not do exactly what you propose, but without using operator >> overloading? that way it isn't >> magic anymore, doesn't override expected behavior of the getitem >> protocol, and still provides >> what's wanted with almost the same amount of chars (call it slice, >> myarr=L([0,1.2.3]); myarr.slice([1,2])==myarr([1,2])) >> > > It's a matter of priorities. I was trying to avoid the double brackets ("([])" > or "[[]]"), which I find much more distasteful than the slight expansion of > the getitem semantics. What I don't like about this is that it's very > inefficient; and that holds regardless of the call syntax used. >
Have you tried shedskin recently? it actually works. I mean, realistically, if he actually ends up with this as a bottleneck, he could try to code it as an iterator (no in between copy in that case), not sure if it would actually be faster (depends really): def slice(self, idx): for i in idx: yield self[i] list(myarr.slice([1,2])) == myarr([1,2]) btw, he can of course have a constructor and slice operator that avoid the double parenthesis if you really want (which btw shedskin doesn't support yet ;), so: def slice(self, *idx): ... class myarr(list): def __init__(self, *items): super(list, self).__init__(items) list(myarr.slice(1,2)) == myarr(1,2) actually I think constructing a list and then giving it to the myarr constructor (by inheritance) shouldn't copy the list. Actually I'm not sure if it's any different then having a wrapper class. > Shai. > -- Alon Levy _______________________________________________ Python-il mailing list [email protected] http://hamakor.org.il/cgi-bin/mailman/listinfo/python-il
