【发布时间】:2012-10-19 13:34:07
【问题描述】:
我正在尝试创建一个字典,其键为name,值为对应的User 对象。
我正在使用来自 Django shell 包装器 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 理解在这里不起作用。
有什么建议吗?
我在这里遗漏了什么吗?
【问题讨论】:
-
我没有看到任何类似的问题,您可能遗漏了什么!
-
可能是字典闭包无法访问与 shell 相同的命名空间。
U = User; u = {name: U.objects.get(username=name) for name in names}有什么不同吗? (只是想知道这是否是一个错误) -
@Rohan,您正在执行哪些步骤? @Dunes ,不,那也不行,我得到
NameError: global name 'U' is not defined -
@DhruvBaldawa,这就是我尝试过的。
>>> type(User) <class 'django.db.models.base.ModelBase'> >>> u = {name: User.objects.get(username=name) for name in names} >>> u {'admin': <User: admin>, 'u1': <User: u1>} >>> -
是的,它可以与 --plain 一起使用,那么这似乎是 IPython 特有的问题。我将在他们的项目中提交错误报告!谢谢:-)
标签: python shell dictionary namespaces dictionary-comprehension