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

Posted

技术标签:

【中文标题】使用 dict 理解时的问题。 NameError:未定义全局名称【英文标题】:Problems when using dict comprehensions. NameError: global name is not defined 【发布时间】: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,这就是我尝试过的。 &gt;&gt;&gt; type(User) &lt;class 'django.db.models.base.ModelBase'&gt; &gt;&gt;&gt; u = name: User.objects.get(username=name) for name in names &gt;&gt;&gt; u 'admin': &lt;User: admin&gt;, 'u1': &lt;User: u1&gt; &gt;&gt;&gt; 是的,它可以与 --plain 一起使用,那么这似乎是 IPython 特有的问题。我将在他们的项目中提交错误报告!谢谢:-) 【参考方案1】:

我相信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)

【讨论】:

是的,我知道这是一种方法,但我的问题不是优化,而是理解:-)

以上是关于使用 dict 理解时的问题。 NameError:未定义全局名称的主要内容,如果未能解决你的问题,请参考以下文章

python 使用eval报错NameError: name ‘null’ is not defined

从源码理解pickle和joblib加载dict的性能不同

Python C++ API:如何检索 NameError 的 lineno 属性

python 使用eval报错NameError: name ‘null’ is not defined

Python UnboundLocalError和NameError错误根源解析

字符串变dict