2015-04-17 77 views
5

我生成使用python的(2.7)eval()功能,像這樣一個條件語句:python有條件(if)語句的最大長度是多少?

my_list = ['2 > 1','3 > 2','4 > 3'] 

if eval('(' + ') or ('.join(my_list) + ')'): 
    print 'yes' 
else: 
    print 'no' 

在我的情況下,由代碼生成的列表,my_list來自一個參數文件,並且該列表加入了與「或'條件表達式中的語句。上面的代碼打印「是」。

它適用於小列表,但在eval()語句中的特定字符數中出現字符串錯誤。

一些網站的搜索找到這些線程指向了一個錯誤:

但他們最大的eval()大小比我找到更大。就我而言,我發現1744到1803個字符之間的問題開始了。我嘗試此代碼,它的兩個語句

>>> eval("1.0*"*10000+"1.0") 
1.0 
>>> eval("1.0*"*100000+"1.0") 
# segfault here 

所以,這使我回想起,這不是eval()函數之間的崩潰,但實際上一些最大的if聲明。

什麼是有條件地應用列表中不涉及長字符串和eval()函數的規則的另一種方法?

有趣的是,我做了my_list大得多:

my_list = ['2 > 1']*1000000 

和代碼工作正常...

+0

如果由代碼產生條件列表,他們爲什麼不馬上在產生評估?爲什麼轉換爲字符串呢? –

+0

@OliverW。條件來自配置文件。因爲它們是'或'的陳述,所以我沒有看到如何一次評估一個。我想我可以有一個布爾標誌,開始爲False,然後設置爲True,如果其中一個'if'語句評估爲True。 – philshem

回答

9

也許我失去了一些東西,但它似乎是:

any(map(eval, my_list)) 

完全是你想要的。

from itertools import imap 

any(imap(eval, my_list)) # Python 2. 

這具有的不錯的效果評估列表的其餘部分,如果第一元件evals到True(也稱爲「短路」)。這可能是也可能不是你所追求的。

實施例:

> any(map(eval, ['2 > 1','3 > 2','4 > 3'])) 
True 
+2

注意:'map'只在Python 3中是懶惰的。在2.7以下,可以使用['itertools.imap'](http://docs.python.org/2/library/itertools.html#itertools.imap)以獲得相同的效果。 (只是說因爲OP使用Python 2.7。) – Carsten

+0

這正是我想要的,包括'短路'。eval()有很多討厭的東西,但我沒有看到另一種方式。 – philshem

+1

@philshem:對eval有恨,理由很充分,但也有一個很好的理由。如果您的目標是「評估一些Python代碼」,我會說這是該工作最直接的工具。只要考慮安全影響以及這是否會對您造成問題。 – ereOn