kenjutsu.kenjutsu module

The module kenjutsu provides support for working with slices.

Overview

The module kenjutsu provides several functions that are useful for working with a Python slice or tuple of slices. 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:
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))