Скажем, у меня есть строка
string = '1234567890'
и я хочу срез этой строки, определенный другой строкой
slice = '5:8'
Это легко сделать с
>>>string[5:8]
'678'
Однако срез передается через файл и изменяется на пользовательский ввод. Их способ сделать что-то вроде
>>>string[eval(slice)]
'678'
Когда я это делаю, я получаю
5:8
^
SyntaxError: invalid syntax
У меня есть функция, которая учитывает все четыре случая, мне просто интересно, был ли их более элегантный способ сделать это.
Спасибо за ваши ответы.
Вы получаете синтаксическую ошибку, так как 5:8
не является действительной инструкцией Python сама по себе; eval
ожидает нормальный код Python, а не только фрагменты.
Если вы действительно хотите использовать eval
, вы можете сказать:
string = '1234567890'
sliceInput = '5:8'
result = eval('string[' + sliceInput + ']')
Однако это не совсем безопасно, если вы разрешаете пользователю вводить данные. Более безопасный способ:
string = '1234567890'
sliceInput = '5:8'
sliceParts = sliceInput.split(':')
if len(sliceParts) != 2:
# Invalid input -- either no ':' or too many
else:
try:
start, end = [ int(x) for x in sliceParts ]
except ValueError:
# Invalid input, not a number
else:
result = string[start : end]
Обратите внимание, что slice()
- это встроенная функция Python, поэтому не рекомендуется использовать ее как имя переменной.
Как насчет:
string = '1234567890'
slice = '5:8'
sliceP = slice.split(':')
string[int(sliceP[0]):int(sliceP[1])]
Синтаксис среза не разрешается за пределами скобок, поэтому он будет разбит, если вы попытаетесь его оценить самостоятельно. Если вы действительно хотите оценить входные данные из файла, вы можете построить полный вызов в виде строки, а затем eval it:
eval("string[" + slice + "]")
Применяются обычные оговорки о eval
: злоумышленник может заставить вашу программу выполнять произвольный код таким образом, поэтому вам может быть лучше попытаться проанализировать границы, а не eval
их.