【问题标题】:content is null after the first dict()在第一个 dict() 之后内容为空
【发布时间】:2015-07-12 11:34:07
【问题描述】:

全部:

在 Django 中,我使用这些词来获取 dict(q_a),但是在第一个 dict() 之后,第二个是 null,python 是如何工作的?

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): {}

【问题讨论】:

  • 这是一个奇怪的空iterator案例。
  • help(dict.iteritems).

标签: python django dictionary


【解决方案1】:

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

【讨论】:

  • 错误术语:iteritems() 返回 iterator 而不是 generator。生成器也有 sendclosethrow 等方法,但迭代器没有。
  • 没错,谢谢你的警告。我总是混合使用这些术语,因为生成器也是迭代器,但反之则不然。
  • 或者你可以把它改成 request.POST.iteritems() 在 Django 中返回一个生成器,因为只提到 iteritems 部分有点模棱两可。
【解决方案2】:

q_a.iteritems() 不是字典,而是生成器(如印刷品所述)。您可以在Python Wiki 上阅读更多关于它们的信息,但通常您只能对它们进行一次迭代。之后,当您尝试再次迭代它们时,它们将引发StopIteration(就像您在最后一行使用dict(q_a) 隐式所做的那样),从而停止循环。这就是您的呼叫导致空字典的原因。

【讨论】:

    【解决方案3】:

    .iteritems() 返回一个iterator 对象。

    generator 也是 iterator。生成器将提供一系列值,而不是像迭代器那样提供一个值。

    第一次调用后,它会生成值,然后变为空。当您进行第二次通话时,它将显示一个空字典。

    当您只需要在代码中使用某些特定值时使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2016-03-19
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多