странность питона - PullRequest
       7

странность питона

0 голосов
/ 29 апреля 2010

У меня есть следующий код в одном из моих классов вместе с проверками, когда код не проверяется:

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)

Я не получаю ничего, чтобы "оценить". Вот результаты:

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 и, как вы можете видеть, код вывел правильно:

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

1 голос
/ 29 апреля 2010

Скорее всего, тип self.recipientIMSI или self.recipientMSISDN равен int, и сравнение их со строками возвращает False. Добавьте эту строку, чтобы увидеть, так ли это:

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

Если нет, попробуйте проверить, к чему относится то же выражение без eval.

Тем не менее, вы уверены, что вам нужно использовать eval? Обычно есть способ сделать что-то без eval или exec, что приведет к более безопасному и более удобному для обслуживания коду.

0 голосов
/ 29 апреля 2010

Почему вы вообще делаете eval вообще? Почему бы просто не сделать сравнение непосредственно в операторе if?

Возможно, существует несоответствие типов. Одним из указанных значений может быть юникод или какой-либо другой тип строкового объекта. Когда вы печатаете его, вы приводите его к строке и, таким образом, они выглядят одинаково, но они могут быть разных типов и поэтому имеют значение False.

0 голосов
/ 29 апреля 2010

Возвращаемое значение из eval не в том, был ли код оценен, а в фактическом значении, возвращаемом при этом. Поскольку в строке кода есть оператор and, предположительно одно или оба выражения оцениваются как False.

...