kenjutsu.kenjutsu module¶
The module kenjutsu
provides support for working with slice
s.
Overview¶
The module kenjutsu
provides several functions that are useful for working
with a Python slice
or tuple
of slice
s. This is of particular
value when working with NumPy.
API¶
-
exception
kenjutsu.kenjutsu.
UnknownSliceLengthException
[source]¶ Bases:
exceptions.Exception
Raised if a slice does not have a known length.
-
kenjutsu.kenjutsu.
len_slice
(a_slice, a_length=None)[source]¶ Determines how many elements a slice will contain.
Raises: UnknownSliceLengthException
– Will raise an exception if- a_slice.stop and a_length is None.
Parameters: - a_slice (slice) – a slice to reformat.
- a_length (int) – a length to fill for stopping if not provided.
Returns: - a new slice with as many values filled in as
possible.
Return type: (slice)
Examples
>>> len_slice(slice(None)) Traceback (most recent call last): UnknownSliceLengthException: Cannot determine slice length without a defined end point. The reformatted slice was slice(0, None, 1).
>>> len_slice(slice(None), 10) 10
>>> len_slice(slice(None), 10) == len(range(10)[:]) True
>>> len_slice(slice(2, None), 10) 8
>>> len_slice(slice(2, None), 10) == len(range(10)[2:]) True
>>> len_slice(slice(2, None, None), 10) 8
>>> len_slice(slice(2, None, None), 10) == len(range(10)[2:]) True
>>> len_slice(slice(2, 6)) 4
>>> len_slice(slice(2, 6), 1000) 4
>>> len_slice(slice(2, 6), 10) == len(range(10)[2:6]) True
>>> len_slice(slice(2, 6, 3)) 2
>>> len_slice(slice(2, 6, 3), 10) == len(range(10)[2:6:3]) True
-
kenjutsu.kenjutsu.
len_slices
(slices, lengths=None)[source]¶ Takes a tuple of slices and reformats them to fill in as many undefined values as possible.
Parameters: - slices (tuple(slice)) – a tuple of slices to reformat.
- lengths (tuple(int)) – a tuple of lengths to fill.
Returns: - a tuple of slices with all default
values filled if possible.
Return type: (slice)
Examples
>>> len_slices(( ... slice(None), ... slice(3, None), ... slice(None, 5), ... slice(None, None, 2) ... )) Traceback (most recent call last): UnknownSliceLengthException: Cannot determine slice length without a defined end point. The reformatted slice was slice(0, None, 1).
>>> len_slices( ... ( ... slice(None), ... slice(3, None), ... slice(None, 5), ... slice(None, None, 2) ... ), ... (10, 13, 15, 20) ... ) (10, 10, 5, 10)
-
kenjutsu.kenjutsu.
reformat_slice
(a_slice, a_length=None)[source]¶ Takes a slice and reformats it to fill in as many undefined values as possible.
Parameters: - a_slice (slice) – a slice to reformat.
- a_length (int) – a length to fill for stopping if not provided.
Returns: - a new slice with as many values filled in as
possible.
Return type: (slice)
Examples
>>> reformat_slice(slice(None)) slice(0, None, 1)
>>> reformat_slice(slice(None), 10) slice(0, 10, 1)
>>> reformat_slice(slice(2, None)) slice(2, None, 1)
>>> reformat_slice(slice(2, None), 10) slice(2, 10, 1)
>>> reformat_slice(slice(2, None, None)) slice(2, None, 1)
>>> reformat_slice(slice(2, None, None), 10) slice(2, 10, 1)
>>> reformat_slice(slice(2, -1, None), 10) slice(2, 9, 1)
>>> range(10)[reformat_slice(slice(None))] == range(10)[:] True
>>> range(10)[reformat_slice(slice(2, None))] == range(10)[2:] True
>>> range(10)[reformat_slice(slice(2, 6))] == range(10)[2:6] True
>>> range(10)[reformat_slice(slice(2, 6, 3))] == range(10)[2:6:3] True
>>> range(10)[reformat_slice(slice(2, None, 3))] == range(10)[2::3] True
>>> range(10)[reformat_slice(slice(None), 10)] == range(10)[:] True
>>> range(10)[reformat_slice(slice(2, None), 10)] == range(10)[2:] True
>>> range(10)[reformat_slice(slice(2, 6), 10)] == range(10)[2:6] True
>>> range(10)[reformat_slice(slice(2, 6, 3), 10)] == range(10)[2:6:3] True
>>> range(10)[reformat_slice(slice(2, None, 3), 10)] == range(10)[2::3] True
>>> range(10)[reformat_slice(slice(2, -6, 3), 10)] == range(10)[2:-6:3] True
>>> range(10)[reformat_slice(slice(2, -1), 10)] == range(10)[2:-1] True
>>> range(10)[reformat_slice(slice(2, 20), 10)] == range(10)[2:20] True
>>> range(10)[reformat_slice(slice(2, -20), 10)] == range(10)[2:-20] True
>>> range(10)[reformat_slice(slice(20, -1), 10)] == range(10)[20:-1] True
>>> range(10)[reformat_slice(slice(-20, -1), 10)] == range(10)[-20:-1] True
>>> range(10)[reformat_slice(slice(-5, -1), 10)] == range(10)[-5:-1] True
-
kenjutsu.kenjutsu.
reformat_slices
(slices, lengths=None)[source]¶ Takes a tuple of slices and reformats them to fill in as many undefined values as possible.
Parameters: - slices (tuple(slice)) – a tuple of slices to reformat.
- lengths (tuple(int)) – a tuple of lengths to fill.
Returns: - a tuple of slices with all default
values filled if possible.
Return type: (slice)
Examples
>>> reformat_slices(slice(None)) (slice(0, None, 1),)
>>> reformat_slices((slice(None),)) (slice(0, None, 1),)
>>> reformat_slices(( ... slice(None), ... slice(3, None), ... slice(None, 5), ... slice(None, None, 2) ... )) (slice(0, None, 1), slice(3, None, 1), slice(0, 5, 1), slice(0, None, 2))
>>> reformat_slices( ... ( ... slice(None), ... slice(3, None), ... slice(None, 5), ... slice(None, None, 2) ... ), ... (10, 13, 15, 20) ... ) (slice(0, 10, 1), slice(3, 13, 1), slice(0, 5, 1), slice(0, 20, 2))