Using Python slice objects for fun and profit
Just a quick tip about the hardly known slice objects in Python.
They are used to implement the slicing syntax for sequence types (lists,
strings):
s = "The quick brown fox jumps over the lazy dog"
# s[4:9] is internally converted (and equivalent) to s[slice(4, 9)].
assert s[4:9] == s[slice(4, 9)]
# 'Not present' is encoded as 'None'
assert s[20:] == s[slice(20, None)]
slice object can be used in normal code too, for example for tracking
regions in strings: instead of having separate start_idx and end_idx
variables (or writing a custom class/namedtuple) simply roll
the indices into a slice.
# A column-aligned table:
table = ('REPOSITORY   TAG      IMAGE ID       CREATED       VIRTUAL SIZE',
         '<none>       <none>   0987654321AB   2 hours ago   385.8 MB',
         'chris/web    latest   0123456789AB   2 hours ago   385.8 MB',
        )
header, *entries = table
# Compute the column slices by parsing the header. Gives a list of slices.
slices = find_column_slices(header)
for entry in entries:
    repo, tag, id, created, size = [entry[sl].strip() for sl in slices]
    ...
This is mostly useful when the indices are computed at runtime and applied to more than one string.
More generally, slice objects encapsulate regions of strings/lists/tuples,
and are an appropriate tool for simplifying code that operates on start/end
indices. They provide a clean abstraction, make the code more straight-forward
and save a bit of typing.
Comments