4c93955b7b
Instances of the slice class are passed to __getitem__() on objects when the user indexes them with a slice. In practice the majority of the time (other than passing it on untouched) is to work out what the slice means in the context of an array dimension of a particular length. Since Python 2.3 there has been a method on the slice class, indices(), that takes a dimension length and returns the real start, stop and step, accounting for missing or negative values in the slice spec. This commit implements such a indices() method on the slice class. It is configurable at compile-time via MICROPY_PY_BUILTINS_SLICE_INDICES, disabled by default, enabled on unix, stm32 and esp32 ports. This commit also adds new tests for slice indices and for slicing unicode strings.
28 lines
611 B
Python
28 lines
611 B
Python
# Test builtin slice indices resolution
|
|
|
|
# A class that returns an item key
|
|
class A:
|
|
def __getitem__(self, idx):
|
|
return idx
|
|
|
|
# Make sure that we have slices and .indices()
|
|
try:
|
|
A()[2:5].indices(10)
|
|
except:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
print(A()[:].indices(10))
|
|
print(A()[2:].indices(10))
|
|
print(A()[:7].indices(10))
|
|
print(A()[2:7].indices(10))
|
|
print(A()[2:7:2].indices(10))
|
|
print(A()[2:7:-2].indices(10))
|
|
print(A()[7:2:2].indices(10))
|
|
print(A()[7:2:-2].indices(10))
|
|
|
|
print(A()[2:7:2].indices(5))
|
|
print(A()[2:7:-2].indices(5))
|
|
print(A()[7:2:2].indices(5))
|
|
print(A()[7:2:-2].indices(5))
|