“Too many values to unpack” 异常:值过多无法解包

140

我正在使用Django开发一个项目,尝试扩展User模型以创建用户个人资料。

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

环境:
请求方法: GET 请求URL:http://localhost:8000/ Django版本:1.1 Python版本:2.6.1
模板错误: 在模板/path/to/base.tpl中,第19行出错 Caught an exception while rendering: too many values to unpack
19 : Hello, {{user.username}} ({{ user.get_profile.rep}}). How's it goin? Logout
异常类型:TemplateSyntaxError at / 异常信息:Caught an exception while rendering: too many values to unpack

您有什么想法或者我做错了什么?


4
信息不足。请发布您的UserProfile模型。 - Daniel Roseman
6个回答

210

这个异常意味着您正在尝试解包一个元组,但是该元组相对于目标变量的数量具有太多的值。例如:这段代码会正常工作,并打印出 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

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


1
@Sterfano Borini,我遇到了类似的错误,但在我的情况下,我正在创建一个字符串 obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}'; 尽管所有值都是字符串,但它仍然给出了错误。我在 Python 提示符上运行它时可以运行,但是在从 web 获取响应时却出现了异常。你能否建议一下出了什么问题? - MegaBytes
对于那些仍然不理解的人(比如我),这个视频用文字和图片解释了完全相同的内容,让我终于明白了 :) - Wesley Smith
错误并不一定意味着正在解包一个“元组”。它可以是任何序列类型。它可能允许任何可迭代类型;我无法立即回忆起来。 - jpmc26

22

尝试在一个变量中解包,

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

5
有人能对此进行更详细的解释吗? - piggyback
@piggyback,你有什么问题吗? - Luc

8
这个问题看起来很熟悉,所以我想从有限的信息中复制一下看看是否能够重现。
快速搜索在James Bennett的博客这里找到了一个条目,提到当使用UserProfile扩展User模型时,在settings.py中常见的错误会导致Django抛出此错误。
引用博客条目:
设置的值不是“appname.models.modelname”,而只是“appname.modelname”。原因是Django不使用它进行直接导入;相反,它使用一个内部模型加载函数,该函数仅需要应用程序名称和模型名称。尝试在AUTH_PROFILE_MODULE设置中执行诸如“appname.models.modelname”或“projectname.appname.models.modelname”之类的操作将导致Django崩溃,出现可怕的“too many values to unpack”错误,请确保您已经将“appname.modelname”放入AUTH_PROFILE_MODULE的值中,除此之外别无其他。
如果OP复制了更多的回溯信息,我希望看到像下面这样的信息,通过将“models”添加到我的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仍然存在一些导入魔法的少数情况之一,当小错误没有抛出预期的异常时,往往会引起混淆。

从我发布的回溯末尾可以看到,除了使用“appname.modelname”表单以外的任何内容作为AUTH_PROFILE_MODULE都会导致该行“app_label,model_name = settings.AUTH_PROFILE_MODULE.split('。')”抛出“too many values to unpack”错误。

我99%确定这就是此处遇到的原始问题。


еҰӮжһңжӮЁзҡ„settings.pyдёӯжІЎжңүAUTH_PROFILE_MODULEдјҡеҸ‘з”ҹд»Җд№Ҳпјҹ - Robert Johnstone

0

很可能在 get_profile() 调用中出现了错误。在您的视图中,在返回请求对象之前,请添加以下行:

request.user.get_profile()

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


0
这种情况发生在我使用Jinja2模板时。可以通过使用runserver_plus命令从django_extensions运行开发服务器来解决问题。
它使用werkzeug调试器,这也恰好更好,并且有一个非常好的交互式调试控制台。它执行一些ajax魔法来启动Python shell在任何框架(在呼叫栈中)上,以便您可以进行调试。

0

在循环中尝试访问index时,忘记使用enumerate

会抛出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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接