python eval怪异

时间:2010-04-29 10:17:19

标签: python eval

我的一个类中有以下代码,并且在代码没有eval时检查:

filterParam="self.recipientMSISDN==tmpBPSS.split('_')[3].split('#')[0] and   self.recipientIMSI==tmpBPSS.split('_')[3].split('#')[1]" 
if eval(filterParam):
   print "Evalled"
else:
   print "Not Evalled\nfilterParam\n'%s'\ntmpBPSS\n'%s'\nself.recipientMSISDN\n'%s'\nself.recipientIMSI\n'%s'" % (filterParam, tmpBPSS, self.recipientMSISDN, self.recipientIMSI)

我没有得到'eval'的任何东西。结果如下:

Not Evalled
filterParam
'self.recipientMSISDN==tmpBPSS.split('_')[3].split('#')[0] and    self.recipientIMSI==tmpBPSS.split('_')[3].split('#')[1]'
tmpBPSS
'bprm_DAILY_MO_919844000039#892000000'
self.recipientMSISDN
'919844000039'
self.recipientIMSI
'892000000'

所以我使用上面的输出来检查python shell中的代码,因为你可以看到正确评估的代码:

>>> filterParam="recipientMSISDN==tmpBPSS.split('_')[3].split('#')[0] and recipientIMSI==tmpBPSS.split('_')[3].split('#')[1]"
>>> tmpBPSS='bprm_DAILY_MO_919844000039#892000000'
>>> recipientMSISDN='919844000039'
>>> recipientIMSI='892000000'
>>> if eval(filterParam):
...    print "Evalled"
... else:
...    print "Not Evalled"
...
Evalled

我是不是摇摇欲坠或者我错过了什么?

A

3 个答案:

答案 0 :(得分:1)

最有可能的是,self.recipientIMSIself.recipientMSISDN的类型为int,将它们与字符串进行比较会返回False。添加此行以查看是否是这种情况:

print type(self.recipientIMSI), type(self.recipientMSISDN)

如果没有,请尝试在没有eval的情况下检查相同表达式的评估结果。

那就是说,你确定需要使用eval吗?通常,有一种方法可以在没有evalexec的情况下执行操作,这将导致更安全,更易于维护的代码。

答案 1 :(得分:0)

来自eval的返回值不是代码是否被评估,而是通过这样做返回的实际值。由于您的代码字符串中有and语句,因此大概有一个或两个表达式的计算结果为False。

答案 2 :(得分:0)

你为什么要做eval呢?为什么不直接在if语句中进行比较?

可能存在类型不匹配。您指定的其中一个值可能是unicode或其他类型的类似字符串的对象。乳清你打印它,你把它铸成一个字符串,所以它们看起来相同,但它们可能是不同的类型,因此评估为假。