У меня есть объект срез, и я хотел бы распечатать его в виде строки 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
None
sВы можете использовать ... 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, которые просто возвращают значения аргументов (или их значения по умолчанию)».