У меня есть объект срез, и я хотел бы распечатать его в виде строки start:stop:step. Как мне это сделать?
s = slice(1, 2, 3); print(f"{s.start}:{s.stop}:{s.step}") ?
Нет ничего встроенного, что могло бы сделать это AFAIK. Вам нужно будет написать собственный код форматирования, используя атрибуты start, stop и step объекта.
@AndrejKesely Это не сработает, если какой-либо из атрибутов равен None, который используется для значений по умолчанию.
@AndrejKesely Если шаг установлен по умолчанию, вам обычно нужен просто start:stop, а не start:stop:






Не зацикливайтесь на этом:
my_slice = slice(1,False,3)
print(f'{my_slice.start if my_slice.start is not None else ""}:{my_slice.stop if my_slice.stop is not None else ""}{(":"+str(my_slice.step)) if my_slice.step is not None else ""}')
А как насчет slice(1, 10)? В идеале это должно давать 1:10, а не 1:10:.
@Barmar 1:10 и 1:10: не эквивалентны функционально? Для меня не было бы шоком, если бы ответ был «нет», но я никогда не сталкивался с таким в своем опыте.
@esqew Вот почему я сказал «в идеале». Я думаю, что они эквивалентны, но дополнительный : не является питоническим.
@Barmar Конечно, для меня это имеет смысл. Обновленный фрагмент должен решить эту проблему. Спасибо, как всегда!
@esqew 1:10 и 1:10: эквивалентны. Оба они приводят к slice(1, 10, None).
Я только что понял, что строки также являются допустимыми значениями, например. my_slice = slice('') должно быть :'', а не :. Я обновил свой ответ. Для себя можно использовать repr(my_slice.<start/stop>) if ... и ":"+repr(my_slice.step). Чтобы внести ясность: строки не используются в стандартной библиотеке AFAIK, но они используются, по крайней мере, в Pandas.
Или даже в стандартной библиотеке вам нужно различать такие ошибки, как slice('9') и slice(9).
Насколько я знаю, для этого нет ничего встроенного, но мы можем легко написать код для этого, используя значения из объекта среза, согласно документации :
Объекты среза имеют атрибуты данных
start,stopиstep, доступные только для чтения, которые просто возвращают значения аргументов (или их значения по умолчанию).
def slice_to_str(s: slice) -> str:
return f'{s.start!r}:{s.stop!r}:{s.step!r}'
Например:
>>> print(slice_to_str(slice(15, 95, 5)))
15:95:5
>>> print(slice_to_str(slice(60)))
None:60:None
NonesВы можете использовать ... is not None else ''
def slice_to_str(s: slice) -> str:
start, stop, step = [
(repr(val) if val is not None else '')
for val in [s.start, s.stop, s.step]]
return f'{start}:{stop}:{step}'
Например:
>>> print(slice_to_str(slice(60)))
:60:
>>> print(slice_to_str(slice(None)))
::
>>> print(slice_to_str(slice(None, None, 2)))
::2
>>> print(slice_to_str(slice('h', 't')))
'h':'t':
NoneПросто добавьте галочку: if s.step is None ...
def slice_to_str(s: slice) -> str:
start, stop, step = [
(repr(val) if val is not None else '')
for val in [s.start, s.stop, s.step]]
step_optional = f':{step}' if s.step is not None else ''
return f'{start}:{stop}{step_optional}'
Например:
>>> print(slice_to_str(slice(60)))
:60
>>> print(slice_to_str(slice(None)))
:
>>> print(slice_to_str(slice(None, None, 2)))
::2
По вашей ссылке «Объекты среза имеют атрибуты данных только для чтения start, stop и step, которые просто возвращают значения аргументов (или их значения по умолчанию)».