2013-02-15 25 views
0

Я знаю, что этот вопрос задан раньше, но я не могу заставить себя работать. Может ли кто-нибудь помочь мне с этим?TypeError: объект «NoneType» не является итерируемым - Python

import sys 

class Template: 
    def processVariable(self, template, data): 
     first = template.find('{{') 
     second = template.find('}}') 
     second = second + 2 
     out = template[first+second] 
     assert[out.startswith('{{')] 
     out = out.strip('{}') 
     rest = template[second:] 
     if out in data: 
      newstring = data[out] 
      return(rest, newstring) 
     else: 
      print "Invalid Data Passed it" 

t = Template() 
vars = { 
    'name': 'Jane', 
    'course': 'CS 1410', 
    'adjective': 'shimmering' 
} 

(rest, out) = t.processVariable('{{name}} is in {{course}}', vars) 

Это ошибка я получаю:

File "template.py", line 28, in <module> 
    (rest, out) = t.processVariable('{{name}} is in {{course}}', vars) 
TypeError: 'NoneType' object is not iterable 

Я понимаю NoneType, но это из-за моего цикл или я просто пропустить что-то простое? Заранее спасибо!

Мой код будет передан в поле, чтобы мой учитель мог запустить код против него, и он пройдет или провалится. Это то, что его код будет работать:

import Candidate 

t = Candidate.Template() 
vars = { 
    'name': 'Jane', 
    'course': 'CS 1410', 
    'adjective': 'shimmering' 
} 

(rest, out) = t.processVariable('{{course}} is {{adjective}}', vars) 
print 'rest is: [' + rest + ']' 
print 'out is : [' + out + '] 

, что он должен вернуть это:

rest is: [ is in {{course}}] 
out is : [Jane] 

вернет Да или Нет, если он работал.

+0

Я не вижу цикл там. Вы отправили полный код? –

+0

Я имел в виду заявление if ... извините –

ответ

1

В коде есть ошибки.

Это:

out = template[first+second] 
assert[out.startswith('{{')] 

Должно быть:

out = template[first:second] 
assert out.startswith('{{') 

И:

else: 
     print "Invalid Data Passed it" 

, вероятно, следует:

else: 
     raise ValueError('Invalid data') 

Кроме того, эта функциональность уже в Python:

from string import Template 
t = Template('$name is in $course') 

vars = { 
    'name': 'Jane', 
    'course': 'CS 1410', 
    'adjective': 'shimmering' 
} 

print(t.substitute(vars)) 

Выход:

Jane is in CS 1410 
+0

Большое спасибо! Вот и все! –

3

Вы ничего не вернули из своей части else, и, следовательно, ваша функция по умолчанию вернет None.

Объявление, конечно, вы не можете распаковать None на две переменные. Попробуйте вернуть кортеж из вашей другой части следующим образом:

if out in data: 
    newstring = data[out] 
    return (rest, newstring) 
else: 
    print "Invalid Data Passed it" 
    return (None, None) 
+0

Gotcha! Итак, я внес изменения, я получаю эту ошибку: Неверные данные переданы –

+0

Где вы используете возвращенный кортеж? Кроме того, что именно вы пытаетесь сделать? –

+0

Извините, я попытался это объяснить, я отредактировал его выше –

0

Почему вы это делаете в первую очередь? Функциональность уже встроена в python.

>>> vars_ = {'name': 'Jane', 
...  'course': 'CS 1410', 
...  'adjective': 'shimmering'} 
>>> print '{name} is in {course}'.format(**vars_) 
Jane is in CS 1410 

Также не называют переменную vars, потому что вы теневые встроенный имя.

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