2012-05-29 2 views
1
def getValue(d, key): 
    for k, v in d.iteritems(): 
     print "{0} == {1}".format(k, key) 
     if k == key: 
      return v 
     elif isinstance(v, dict): 
      getValue(v, key) 
    logging.error("Cannot find key in dictionary") 
    return "" 

#d = getting the dictionary 

getValue(d, "error_frames") 

Из инструкции печати, которую я вставлял в функцию, я ясно вижу, что в консоли отображаются «error_frames == error_frames», но оператор if не выполняется. Зачем? Словарь строится путем разбора xml с модулем xmltodict.Почему эти строки не равны? (Python)

+2

Попробуйте напечатать 'repr (k)' и 'repr (key)' вместо использования 'str.format'. –

ответ

6

Возможно, оператор печати выполняется из вложенного рекурсивного вызова.

elif isinstance(v, dict): 
     getValue(v, key) 

Должно ли быть return getValue(key)?

+0

Хороший улов (+1): мое чувство кишки заключается в том, что это решит проблему. – mgilson

12

.format вызывает метод объекта __str__, и его вывод может быть идентичным для разных объектов.

In [1]: a = 1 

In [2]: b = '1' 

In [3]: print '{0} == {1}'.format(a, b) 
1 == 1 

In [4]: a == b 
Out[4]: False 
+1

Я думаю, что вы имеете в виду, что '.format' вызывает' __str__'. В этом случае print вызывает '__str__' строковый объект, который просто возвращает строку. – mgilson

+0

@mgilson - вы правы, это был формат, а не 'print'. – eumiro

Смежные вопросы