我的一个类中有以下代码,并且在代码没有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
答案 0 :(得分:1)
最有可能的是,self.recipientIMSI
或self.recipientMSISDN
的类型为int
,将它们与字符串进行比较会返回False。添加此行以查看是否是这种情况:
print type(self.recipientIMSI), type(self.recipientMSISDN)
如果没有,请尝试在没有eval
的情况下检查相同表达式的评估结果。
那就是说,你确定需要使用eval
吗?通常,有一种方法可以在没有eval
或exec
的情况下执行操作,这将导致更安全,更易于维护的代码。
答案 1 :(得分:0)
来自eval
的返回值不是代码是否被评估,而是通过这样做返回的实际值。由于您的代码字符串中有and
语句,因此大概有一个或两个表达式的计算结果为False。
答案 2 :(得分:0)
你为什么要做eval呢?为什么不直接在if语句中进行比较?
可能存在类型不匹配。您指定的其中一个值可能是unicode或其他类型的类似字符串的对象。乳清你打印它,你把它铸成一个字符串,所以它们看起来相同,但它们可能是不同的类型,因此评估为假。