使用dict理解时的问题。 NameError:未定义全局名称

时间:2012-10-30 08:25:15

标签: python shell dictionary namespaces dictionary-comprehension

我正在尝试创建一个密钥为name的dict,并将值设置为对应的User对象。

我使用的是来自Django shell wrapper python manage.py shell的Python shell:

>>> from django.contrib.auth.models import User
>>> names = ['carl', 'jim', 'jack', 'john', 'mark']
# Now using some dict comprehension
>>> u = {name: User.objects.get(username=name) for name in names}
NameError: global name 'User' is not defined

然而,这对我有用:

u = {}
for name in names:
    u[name] = User.objects.get(username=name)

我得到了所需的输出,即:

{ 
  'carl': <User: carl>,
  'jack': <User: jack>,
  'jim' : <User: jim>,
  'john': <User: john>,
  'mark': <User: mark>
}

我知道,还有其他方法可以实现这一点,但我很好奇为什么dict理解不能在这里工作。

任何提示?
我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:2)

我相信python's issue tracer对你来说是最好的答案。

简而言之:它无法在shell中运行。这同样适用于shell中的函数定义。那里的进口是不可取的。

关于你的问题,我建议:

names = [...]
users = User.objects.filter(username__in=names)
name_to_user = {user.username: user for user in users}

它执行一个sql查询而不是len(names)