2010-04-29 5 views
0

Je le code suivant dans un de mes cours ainsi que les chèques lorsque le code ne eval:python eval bizarreries

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) 

Je ne reçois rien à eval. Voici les résultats:

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' 

J'utilise les sorties de ce qui précède pour vérifier le code dans un shell python et que vous pouvez voir le code evalled correctement:

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

Suis-je sur mon rocker ou qu'est-ce qui me manque?

A

Répondre

1

Très probablement, le type de self.recipientIMSI ou self.recipientMSISDN est int, et en les comparant avec des chaînes retourne Faux. Ajoutez cette ligne pour voir si tel est le cas:

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

Sinon, essayez de vérifier ce que la même expression est évaluée à sans eval.

Cela dit, êtes-vous sûr de devoir utiliser eval? Habituellement, il ya une façon de faire les choses sans eval ou exec, ce qui conduira à un code plus sûr et plus maintenable.

+0

brillant. J'ai regardé tout mais j'ai raté ça. Merci beaucoup. Je déchirais les petits cheveux que j'avais essayés pour voir ce qui n'allait pas. – amadain

0

La valeur de retour de eval n'est pas si ou le code a été évalué, mais la valeur réelle retournée en faisant ainsi. Étant donné que vous avez une instruction and dans votre chaîne de code, il est probable que l'une des expressions ou les deux aient une valeur False.

0

Pourquoi faites-vous même l'évaluation? Pourquoi ne pas simplement faire la comparaison directement dans l'instruction if?

Il est possible qu'il y ait une différence de type. L'une de ces valeurs que vous spécifiez peut être unicode ou un autre type d'objet semblable à une chaîne. Quand vous l'imprimez, vous le lancez en une chaîne et ainsi ils ont l'air égaux, mais ils peuvent être de différents types, et ainsi évaluer à Faux.

+0

J'utilise eval car filterParam est une instruction générée qui est très différente en fonction de la façon dont la méthode est appelée – amadain

+0

@amadain, C'est pour cela que les fonctions sont. –