2015-07-12 3 views
1

всего:содержание является недействительным после первого Dict()

В Django, я использую эти слова, чтобы получить Dict (q_a), но после первого Dict(), вторая равна нулю, то как питон работы для этого?

if request.method == "POST": 
    q_a = request.POST.iteritems() 
    print "type of q_a is %s" % q_a 
    print "first dict(q_a) : %s " % dict(q_a) 
    print "second dict(q_a): %s " % dict(q_a) 

Вот распечатки:

type of q_a is <generator object _iteritems at 0x10c97ac30> 
first dict(q_a) : {u'csrfmiddlewaretoken': u'KQA7K6MCwZWFsXO59pAOYOMyD92O9tYq', u'\u5b66\u9662': u'ss', u'\u59d3\u540d': u'ww', u'\u624b\u673a\u53f7\u7801': u''} 
second dict(q_a): {} 
+0

Это любопытный случай с пустым [итератором] (https://docs.python.org/2/glossary.html#term-iterator). –

+0

'help (dict.iteritems)'. – juanchopanza

ответ

2

request.POST.iteritems() возвращает объект генератора и истощаются после первого dict вызова.

if request.method == "POST": 
    q_a = dict(request.POST.iteritems()) 
    print "first dict(q_a) : %s " % q_a 
    print "second dict(q_a): %s " % q_a 
+0

** Неверный ** термин: 'iteritems()' возвращает [** iterator **] (https://docs.python.org/2/glossary.html#term-iterator) not [** generator ** ] (https://docs.python.org/2/glossary.html#term-generator). Генератор также имеет методы, такие как 'send',' close', 'throw' и т. Д., Но итераторы этого не делают. –

+0

Правильно, спасибо за предупреждение. Я всегда смешивал эти термины, поскольку генераторы также являются итераторами, но не наоборот. – ozgur

+0

Или вы можете изменить его, чтобы сказать 'request.POST.iteritems()' возвращает генератор в Django, потому что просто упоминание 'iteritems' части немного неоднозначно. –

0

q_a.iteritems() не словарь, это генератор (как говорит печати). Вы можете больше узнать о них на Python Wiki, но в общем вы можете перебирать их только один раз. После этого они поднимут StopIteration, когда вы попытаетесь повторить их снова (как вы неявно используете последнюю строку, используя dict(q_a)), которая останавливает цикл. Вот почему ваш звонок приводит к пустому dict.

+0

спасибо, я проверю Python Wiki. – Cheer

0

.iteritems() возвращает iterator объект.

A generator также является iterator. Генератор предоставит последовательность значений вместо единицы, как в случае итераторов.

После первого вызова он генерирует значения и затем становится пустым. Когда вы сделаете второй звонок, он покажет пустой dict.

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

+0

Получил это, спасибо большое. – Cheer