【发布时间】:2015-06-24 09:16:47
【问题描述】:
我使用 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 来自一个参数文件,并且列表与条件表达式中的“或”语句相连接。上面的代码打印“是”。
它适用于小列表,但在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
代码运行良好...
【问题讨论】:
-
如果条件列表是由代码生成的,为什么在生成时不立即评估?为什么要转换为字符串?
-
@OliverW。条件来自配置文件。因为它们是“或”陈述,所以我不知道如何一次评估一个。我想我可以有一个布尔标志,它以 False 开头,然后如果“if”语句之一的计算结果为 True,则设置为 True。
标签: python python-2.7 conditional eval conditional-statements