【问题标题】:"Too many values to unpack" Exception“要解压的值太多”异常
【发布时间】:2010-12-01 13:47:45
【问题描述】:

我正在使用 Django 开发一个项目,并且我刚刚开始尝试扩展 User 模型以制作用户配置文件。

不幸的是,我遇到了一个问题:每次我尝试在模板中获取用户的个人资料(例如user.get_template.lastIP)时,都会收到以下错误:

环境: 请求方法:GET 请求网址:http://localhost:8000/ Django 版本:1.1 Python版本:2.6.1 模板错误: 在模板 /path/to/base.tpl 中,第 19 行出现错误 渲染时遇到异常:解包的值太多 19:你好,{{user.username}} ({{ user.get_profile.rep}})。近况如何?登出 异常类型:TemplateSyntaxError at / 异常值:渲染时捕获异常:解包的值太多

关于发生了什么或我做错了什么有什么想法吗?

【问题讨论】:

  • 信息不足。请发布您的 UserProfile 模型。

标签: python django


【解决方案1】:

get_profile() 调用中的某处很可能存在错误。在您看来,在您返回请求对象之前,请输入以下行:

request.user.get_profile()

它应该会引发错误,并为您提供更详细的回溯,然后您可以使用它来进一步调试。

【讨论】:

    【解决方案2】:

    该异常意味着您正在尝试解包元组,但元组的值相对于目标变量的数量过多。例如:这项工作,并打印 1,然后 2,然后 3

    def returnATupleWithThreeValues():
        return (1,2,3)
    a,b,c = returnATupleWithThreeValues()
    print a
    print b
    print c
    

    但这会引发你的错误

    def returnATupleWithThreeValues():
        return (1,2,3)
    a,b = returnATupleWithThreeValues()
    print a
    print b
    

    加注

    Traceback (most recent call last):
      File "c.py", line 3, in ?
        a,b = returnATupleWithThreeValues()
    ValueError: too many values to unpack
    

    现在,我不知道为什么会在您的情况下发生这种情况,但也许这个答案会为您指明正确的方向。

    【讨论】:

    • @Sterfano Borini,我也遇到了类似的错误,但在我的情况下,我创建了一个字符串为 obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}'; 尽管所有值都是字符串,但它给了我错误,我在 python 提示符下运行它它正在运行,但是在从网络上获取响应时,它给了我这个异常。你能建议出什么问题吗?
    • 对于任何仍然不明白的人(即我)this video 解释了完全相同的事情......用文字和图片让我明白了:)
    • 该错误并不一定意味着正在解压tuple。它可以是任何序列类型。它可能允许任何可迭代的类型;我不记得了。
    【解决方案3】:

    当我将 Jinja2 用于模板时,我会遇到这种情况。该问题可以通过使用来自django_extensionsrunserver_plus 命令运行开发服务器来解决。

    它使用werkzeug 调试器,它也恰好更好,并且有一个非常好的交互式调试控制台。它在 any 帧(在调用堆栈中)启动 python shell 具有一些 ajax 魔力,因此您可以进行调试。

    【讨论】:

      【解决方案4】:

      这个问题看起来很熟悉,所以我想看看我是否可以从有限的信息中复制出来。

      快速搜索发现 James Bennett 的博客 here 中的一个条目,其中提到在使用 UserProfile 扩展 User 模型时,settings.py 中的一个常见错误可能导致 Django 抛出此错误。

      引用博客条目:

      设置的值不是“appname.models.modelname”,它只是“appname.modelname”。原因是 Django 没有使用它来进行直接导入;相反,它使用了一个内部模型加载函数,它只需要应用程序的名称和模型的名称。尝试在 AUTH_PROFILE_MODULE 设置中执行诸如“appname.models.modelname”或“projectname.appname.models.modelname”之类的操作会导致 Django 因可怕的“太多值无法解包”错误而崩溃,所以请确保你已经在 AUTH_PROFILE_MODULE 的值中放入“appname.modelname”,仅此而已。

      如果 OP 复制了更多回溯,我希望看到类似于下面的内容,我可以通过将“模型”添加到我的 AUTH_PROFILE_MODULE 设置来复制。

      TemplateSyntaxError at /
      
      Caught an exception while rendering: too many values to unpack
      
      Original Traceback (most recent call last):
        File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/debug.py", line 71, in render_node
          result = node.render(context)
        File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/debug.py", line 87, in render
          output = force_unicode(self.filter_expression.resolve(context))
        File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 535, in resolve
          obj = self.var.resolve(context)
        File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 676, in resolve
          value = self._resolve_lookup(context)
        File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 711, in _resolve_lookup
          current = current()
        File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/contrib/auth/models.py", line 291, in get_profile
          app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')
      ValueError: too many values to unpack
      

      我认为这是 Django 仍然有一点导入魔法的少数情况之一,当一个小错误没有引发预期的异常时往往会引起混乱。

      您可以在回溯的末尾看到我发布了如何为 AUTH_PROFILE_MODULE 使用除“appname.modelname”之外的任何形式会导致“app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')”行抛出“太多的值无法解包”错误。

      我 99% 确定这是这里最初遇到的问题。

      【讨论】:

      • 如果您的settings.py 中没有AUTH_PROFILE_MODULE 会怎样?
      【解决方案5】:

      尝试在一个变量中解包,

      python 会将其作为列表处理,

      然后从列表中解压

      def returnATupleWithThreeValues():
          return (1,2,3)
      a = returnATupleWithThreeValues() # a is a list (1,2,3)
      print a[0] # list[0] = 1
      print a[1] # list[1] = 2
      print a[2] # list[2] = 3
      

      【讨论】:

      • 有人能解释更多吗?
      • @piggyback 确定你的问题是什么?
      【解决方案6】:

      忘记enumerate以尝试access index in a loop

      抛出ValueError: too many values to unpack (expected 2)

      for index, value in your_list:
        assert value is your_list[index]  # this line not reached
      

      没有抛出异常:

      for index, value enumerate(in your_list):
        assert value is your_list[index]
      

      【讨论】:

        猜你喜欢
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 2013-10-03
        相关资源
        最近更新 更多