On May 5, 2015 5:46 AM, "Cecil Westerhof" <ce...@decebal.nl> wrote: > > Op Tuesday 5 May 2015 12:41 CEST schreef Steven D'Aprano: > > > # Untested. > > def get_message_slice(message_filename, start=0, end=None, step=1): > > real_file = expanduser(message_filename) > > messages = [] > > # FIXME: I assume this is expensive. Can we avoid it? > > nr_of_messages = get_nr_of_messages(real_file) > > If I want to give the possibility to use negative values also, I need > the value.
You could make this call only if one of the boundaries is actually negative. Then callers that provide positive values don't need to pay the cost of that case. Alternatively, consider that it's common for slices of iterators to disallow negative indices altogether, and question whether you really need that. > > the_slice = slice(start, end, step) > > # Calculate the indexes in the given slice, e.g. > > # start=1, stop=7, step=2 gives [1,3,5]. > > indices = range(*(the_slice.indices(nr_of_messages))) > > with open(real_file, 'r') as f: > > for i, message in enumerate(f): > > if i in indices: > > messages.append(message) > > return messages I approve of using slice.indices instead of calculating the indices manually, but otherwise, the islice approach feels cleaner to me. This reads like a reimplementation of that.
-- https://mail.python.org/mailman/listinfo/python-list