convert a slice to successive two slices. The first slice always has a positive step. >>> _decompose_slice(slice(2, 98, 2), 99) (slice(2, 98, 2), slice(None, None, None)) >>> _decompose_slice(slice(98, 2, -2), 99) (slice(4, 99, 2), slice(None, None, -1)) >>> _decompose_sli
(key: slice, size: int)
| 1207 | |
| 1208 | |
| 1209 | def _decompose_slice(key: slice, size: int) -> tuple[slice, slice]: |
| 1210 | """convert a slice to successive two slices. The first slice always has |
| 1211 | a positive step. |
| 1212 | |
| 1213 | >>> _decompose_slice(slice(2, 98, 2), 99) |
| 1214 | (slice(2, 98, 2), slice(None, None, None)) |
| 1215 | |
| 1216 | >>> _decompose_slice(slice(98, 2, -2), 99) |
| 1217 | (slice(4, 99, 2), slice(None, None, -1)) |
| 1218 | |
| 1219 | >>> _decompose_slice(slice(98, 2, -2), 98) |
| 1220 | (slice(3, 98, 2), slice(None, None, -1)) |
| 1221 | |
| 1222 | >>> _decompose_slice(slice(360, None, -10), 361) |
| 1223 | (slice(0, 361, 10), slice(None, None, -1)) |
| 1224 | """ |
| 1225 | start, stop, step = key.indices(size) |
| 1226 | if step > 0: |
| 1227 | # If key already has a positive step, use it as is in the backend |
| 1228 | return key, slice(None) |
| 1229 | else: |
| 1230 | # determine stop precisely for step > 1 case |
| 1231 | # Use the range object to do the calculation |
| 1232 | # e.g. [98:2:-2] -> [98:3:-2] |
| 1233 | exact_stop = range(start, stop, step)[-1] |
| 1234 | return slice(exact_stop, start + 1, -step), slice(None, None, -1) |
| 1235 | |
| 1236 | |
| 1237 | def _decompose_vectorized_indexer( |
no outgoing calls
no test coverage detected
searching dependent graphs…