开发者

python eval weirdness

开发者 https://www.devze.com 2022-12-28 09:21 出处:网络
I have the following code in one of my classes along with checks when the code does not eval: filterParam=\"self.recipientMSISDN==tmpBPSS.split(\'_\')[3].split(\'#\')[0] andself.recipientIMSI==tmpBPS

I have the following code in one of my classes along with checks when the code does not 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)

I am not getting anything to 'eval'. Here are the results:

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'

So I used the outputs from the above to check the code in a python shell and as you can see the code evalled correctly:

>>> 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

Am I off my rocker or what am I missing?

A


Most likely, the type of self.recipientIMSI or self.recipientMSISDN is int, and comparing them with strings returns False. Add this line to see if this is the case:

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

If not, try checking what the same expression evaluates to without eval.

That said, Are you sure you need to use eval? Usually there's a way of doing things without eval or exec, which will lead to safer, more maintainable code.


The return value from eval is not whether or the code was evaluated, but the actual value returned by doing so. Since you have an and statement in your code string, presumably one or both of the expressions evaluate to False.


Why are you even doing the eval at all? Why not just make the comparison directly in the if statement?

It's possible there is a type mismatch. One of those values you specify could be unicode or some other type of string-like object. Whey you print it, you're casting it to a string and so they look equal, but they may be different types, and so evaluate to False.

0

精彩评论

暂无评论...
验证码 换一张
取 消