簡體   English   中英

python eval和字符串索引

[英]python eval and string indexing

假設我有一個字符串

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])]

slice語法不允許在方括號之外,因此如果您嘗試自己對其進行評估,則它將斷開。 如果您確實希望評估文件中的輸入,則可以將完整的調用構造為字符串,然后評估它:

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

有關eval的通常警告:適用於惡意用戶的程序可以使您的程序以這種方式執行任意代碼,因此嘗試解析邊界而不是eval邊界可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM