2015-02-16 2 views
2

Я выполняю назначение python, но есть ошибка, когда я хотел протестировать вышеприведенный пример.Ошибка: объект 'function' не подлежит индексированию

Вот мой код:

def evalTerm(env, t): 
    if type(t) == Node: 
     for label in t: 
      children = t[label] 
      if label == 'Number': 
       t = children[0] 
       return t 

      elif label == 'Add': 
       t1 = children[0] 
       v1 = evalTerm(env, t1) 
       t2 = children[1] 
       v2 = evalTerm(env, t2) 
       return v1 + v2 

      elif label == 'Multiply': 
       t1 = children[0] 
       v1 = evalTerm(env, t1) 
       t2 = children[1] 
       v2 = evalTerm(env, t2) 
       return v1 * v2 


      elif label == 'Variable': 
       x = children[0] 
       if x in env: 
        return env[x] 
       else: 
        print(x + " is unbound") 
        exit() 

      elif label == 'Int': 
       f = children[0] 

       v = evalTerm[env, f] 
       if v == 'True': 
        return 1 
       elif v == 'False': 
        return 0 

      elif label == 'Parens': 
       x = children[0] 
       v = evalTerm(env, x) 
       return v 

    elif type(f) == Leaf: 
     if f == 'True': 
      return 'True' 
     if f == 'False': 
      return 'False' 

Когда я проверить его с помощью:

evalTerm({}, {'Int': ['True']}) 

он дает ошибку:

'function' object is not subscriptable

Как я могу это исправить?

+0

Кстати: в моем коде я написал: Node = dict; Leaf = str – Jason

+0

Это ваш фактический отступ? Для python нам нужно увидеть точный отступ, который вы используете. – khelwood

+0

Это сообщение об ошибке указывает на определенную строку? Вероятно, ошибка там ... Также включите в свой вопрос команду 'Node = dict',' Leaf = str'! – Jasper

ответ

3

Это невозможно сказать наверняка без полного TRACEBACK, но скорее всего, это ваша проблема:

v = evalTerm[env, f] 

evalTerm рекурсивная функция, которую вы должны были бы назвать (обратите внимание на дополнительные () вместо []) :

v = evalTerm(env, f) 

квадратные скобки [ ] в Python используются для subscription или индексации - это означает, что, например адресации значения в dictionary ею s ключ или элемент в list по его индексу.

Если вы получаете исключение 'foo' object is not subscriptable, это означает, что вы пытались использовать подписку для объекта типа 'foo', который его не поддерживает.

+0

О! Ах! Глупая ошибка, спасибо за ответ! – Jason

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