2015-04-17 242 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