假设我有一个字符串
string = '1234567890'
我想要一个由另一个字符串
定义的字符串片slice = '5:8'
这很容易用
>>>string[5:8]
'678'
但是,切片通过文件传入并更改用户输入。他们是一种做某事的方式,如
>>>string[eval(slice)]
'678'
当我这样做时,我得到了
5:8
^
SyntaxError: invalid syntax
我有一个功能可以解释所有四种情况,我只是想知道他们是否是一种更优雅的方式。
感谢您的回答。
答案 0 :(得分: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 :(得分:1)
怎么样:
string = '1234567890'
slice = '5:8'
sliceP = slice.split(':')
string[int(sliceP[0]):int(sliceP[1])]
答案 2 :(得分:0)
在括号外不允许使用切片语法,因此如果您尝试自行评估它,它将会中断。如果你真的想要从文件中评估输入,你可以将完整的调用构造为字符串,然后评估它:
eval("string[" + slice + "]")
关于eval
的常见警告适用:恶意用户可以让您的程序以这种方式执行任意代码,因此您可能最好不要尝试解析边界而不是eval
。