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)
并且代码工作正常......
也许我错过了一些东西但看起来似乎:
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)
归档时间: |
|
查看次数: |
1348 次 |
最近记录: |