Passing Python slice syntax around to functions
python, slice, syntax
Solution
Perhaps something along the following lines would work for you:
class SliceMaker(object):
def __getitem__(self, item):
return item
make_slice = SliceMaker()
print make_slice[3]
print make_slice[0:]
print make_slice[:-1]
print make_slice[1:10:2,...]
The idea is that you use `make_slice[]` instead of manually creating instances of `slice`. By doing this you'll be able to use the familiar square brackets syntax in all its glory.
Problem
In Python, is it possible to encapsulate exactly the common slice syntax and pass it around? I know that I can use `slice` or `__slice__` to emulate slicing. But I want to pass the exact same syntax that I would put in the square brackets that would get used with `__getitem__`. For example, suppose I wrote a function to return some slice of a list. ``` def get_important_values(some_list, some_condition, slice): elems = filter(some_condition, some_list) return elems[slice] ``` This works fine if I manually pass in a slice object: ``` In [233]: get_important_values([1,2,3,4], lambda x: (x%2) == 0, slice(0, None)) Out[233]: [2, 4] ``` But what I want to let the user pass is exactly the same slicing they would have used with `__getitem__`: ``` get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:-1) ) # or get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:) ) ``` Obviously this generates a syntax error. But is there any way to make this work, without writing my own mini parser for the `x:y:t` type slices, and forcing the user to pass them as strings? Motivation I could just make this example function return something directly sliceable, such as `filter(some_condition, some_list)`, which will be the whole result as a list. In my actual example, however, the internal function is much more complicated, and if I know the slice that the user wants ahead of time, I can greatly simplify the calculation. But I want the user to not have to do much extra to tell me the slice ahead of time.