После прочтения «технической документации» ( здесь ), а именно предложения:
Если любая из границ отрицательна, к ней добавляется длина последовательности.
Я решил попробовать это, и это сработало:
>>> foo = '0123456'
>>> foo[3:-1-len(foo):-1]
'3210'
>>>
Так что я думаю, что лучшим ответом для программного определения «конечной точки» было бы предоставление хорошо названной вспомогательной функции, которая делаетЯсно, что его аргументы всегда обрабатываются как положительные смещения, может быть special_slice()
Я думаю, что ясность этого «особого» случая чрезвычайно важна, так как множество общих и значимых вариантов использования зависит от поведения по умолчанию отрицательногосмещения (т.е. добавление длины к ним).Лично я часто использую конечную точку «-1» для обозначения: остановка перед последним элементом.
Итак, основываясь на вашем комментарии:
... алгоритм, который работает примерно такследующим образом: foo [i: i-4: -1], и начинается с высокого 'i' и идет вниз.
Я мог бы сделать следующее:
def slice_by_len(data, start, length, step=1):
end = start + length if step > 0 else start - length
if end < 0:
# Fix the negative offset to get what we really want
end -= len(data)
return data[start:end:step]
И затем вызывать его для каждого необходимого среза:
foo_part = slice_by_len(foo, i, 4, -1)
Вышеуказанное может легко зацикливаться на значениях 'i'