Python Eval и индексация строк

1

Скажем, у меня есть строка

string = '1234567890'

и я хочу срез этой строки, определенный другой строкой

slice = '5:8'

Это легко сделать с

>>>string[5:8]
'678'

Однако срез передается через файл и изменяется на пользовательский ввод. Их способ сделать что-то вроде

>>>string[eval(slice)]
'678'

Когда я это делаю, я получаю

    5:8
     ^
SyntaxError: invalid syntax

У меня есть функция, которая учитывает все четыре случая, мне просто интересно, был ли их более элегантный способ сделать это.

Спасибо за ваши ответы.

Теги:
string

3 ответа

2
Лучший ответ

Вы получаете синтаксическую ошибку, так как 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, поэтому не рекомендуется использовать ее как имя переменной.

1

Как насчет:

string = '1234567890'
slice = '5:8'
sliceP = slice.split(':')
string[int(sliceP[0]):int(sliceP[1])]
0

Синтаксис среза не разрешается за пределами скобок, поэтому он будет разбит, если вы попытаетесь его оценить самостоятельно. Если вы действительно хотите оценить входные данные из файла, вы можете построить полный вызов в виде строки, а затем eval it:

eval("string[" + slice + "]")

Применяются обычные оговорки о eval: злоумышленник может заставить вашу программу выполнять произвольный код таким образом, поэтому вам может быть лучше попытаться проанализировать границы, а не eval их.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню