python 条件 (if) 语句是否有最大长度?
Is there a max length to a python conditional (if) statement?
我使用 python 的 (2.7) eval()
函数生成条件语句,如下所示:
my_list = ['2 > 1','3 > 2','4 > 3']
if eval('(' + ') or ('.join(my_list) + ')'):
print 'yes'
else:
print 'no'
在我的例子中,列表是由代码生成的,my_list来自参数文件,并且列表与条件表达式中的'or'语句连接。上面的代码打印 'yes'.
它适用于小型列表,但在 eval()
语句中出现一定数量的字符时出现字符串错误。
一些搜索发现这些线程指向一个错误:
Why is there a length limit to python's eval?
segmentation fault in pi calculation (python)
但是它们的最大 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
并且代码工作正常...
也许我遗漏了什么,但看起来是:
any(map(eval, my_list))
完全符合您的要求。
from itertools import imap
any(imap(eval, my_list)) # Python 2.
如果第一个元素评估为 True
(也称为 "short-circuit"),这具有 不评估列表其余部分的良好效果。这可能是也可能不是您所追求的。
示例:
> any(map(eval, ['2 > 1','3 > 2','4 > 3']))
True
我使用 python 的 (2.7) eval()
函数生成条件语句,如下所示:
my_list = ['2 > 1','3 > 2','4 > 3']
if eval('(' + ') or ('.join(my_list) + ')'):
print 'yes'
else:
print 'no'
在我的例子中,列表是由代码生成的,my_list来自参数文件,并且列表与条件表达式中的'or'语句连接。上面的代码打印 'yes'.
它适用于小型列表,但在 eval()
语句中出现一定数量的字符时出现字符串错误。
一些搜索发现这些线程指向一个错误:
Why is there a length limit to python's eval?
segmentation fault in pi calculation (python)
但是它们的最大 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
并且代码工作正常...
也许我遗漏了什么,但看起来是:
any(map(eval, my_list))
完全符合您的要求。
from itertools import imap
any(imap(eval, my_list)) # Python 2.
如果第一个元素评估为 True
(也称为 "short-circuit"),这具有 不评估列表其余部分的良好效果。这可能是也可能不是您所追求的。
示例:
> any(map(eval, ['2 > 1','3 > 2','4 > 3']))
True