Python Eval и индексация строк - PullRequest
1 голос
/ 19 марта 2011

Допустим, у меня есть строка

string = '1234567890'

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

slice = '5:8'

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

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

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

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

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

    5:8
     ^
SyntaxError: invalid syntax

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

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

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

Вы получаете синтаксическую ошибку, поскольку 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 голос
/ 19 марта 2011

Как насчет:

string = '1234567890'
slice = '5:8'
sliceP = slice.split(':')
string[int(sliceP[0]):int(sliceP[1])]
0 голосов
/ 19 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...