python条件(if)语句有最大长度吗?

phi*_*hem 5 python conditional eval conditional-statements python-2.7

我使用python(2.7)eval()函数生成一个条件语句,如下所示:

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

if eval('(' + ') or ('.join(my_list) + ')'):
    print 'yes'
else:
    print 'no'
Run Code Online (Sandbox Code Playgroud)

在我的例子中,列表由代码生成,my_list来自参数文件,列表与条件表达式中的'或'语句连接.上面的代码打印'是'.

它适用于小列表,但在eval()语句中的一定数量的字符,我得到一个字符串错误.

一些搜索发现这些线程指向一个错误:

但是他们的最大eval()大小比我发现的要大得多.在我的情况下,我发现问题开始在1744和1803之间.我尝试了这个代码,它确实在两个语句之间崩溃了

>>> eval("1.0*"*10000+"1.0")
1.0
>>> eval("1.0*"*100000+"1.0")
# segfault here
Run Code Online (Sandbox Code Playgroud)

所以,这让我回想起它不是eval(),但实际上是if声明中的一些最大值.

有条件地在列表中应用不涉及长字符串和eval()函数的规则的另一种方法是什么?

有趣的是,我使my_list更大:

my_list = ['2 > 1']*1000000
Run Code Online (Sandbox Code Playgroud)

并且代码工作正常......

ere*_*eOn 9

也许我错过了一些东西但看起来似乎:

any(map(eval, my_list))
Run Code Online (Sandbox Code Playgroud)

完全是你想要的.

from itertools import imap

any(imap(eval, my_list)) # Python 2.
Run Code Online (Sandbox Code Playgroud)

如果第一个元素逃避(也称为"短路"),这具有评估列表其余部分的良好效果True.这可能是也可能不是你所追求的.

例:

> any(map(eval, ['2 > 1','3 > 2','4 > 3']))
True
Run Code Online (Sandbox Code Playgroud)

  • 注意:`map`在Python 3中只是懒惰.在2.7下,可以使用[`itertools.imap`](http://docs.python.org/2/library/itertools.html#itertools.imap)代替得到同样的效果.(只是说因为OP使用的是Python 2.7.) (2认同)