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