【发布时间】:2014-04-17 12:53:36
【问题描述】:
我正在尝试根据不同的参数创建一个 timedelta 字典。例如。
from django.utils import timezone
a = {'Minutes':(lambda dt,delta: dt + timezone.timedelta(minutes=delta)),
'Hours': (lambda dt,delta: dt + timezone.timedelta(hours=delta)}
现在在使用上面的字典时:
new_time = a['Minutes'](timezone.now(),10)
它给出以下错误:
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <lambda>(dt, delta)
----> 1 a = {'Minutes':(lambda dt,delta: dt + timezone.timedelta(minutes=delta))}
NameError: global name 'timezone' is not defined
请解释为什么我不能在 lambda 中使用导入的函数。
【问题讨论】:
-
您的代码在 Django 1.6.1 控制台中对我来说可以正常工作(添加缺少的括号后)。
-
不适合我。我正在使用 django 1.4 和 python 2.7。
-
您是否在导入
django.utils.timezone的同一模块中使用a?当函数被调用而不是定义时,会在 lambda 的主体中查找名称。 -
@Anuj 这实际上是 Django
./manage.py shell中的一个错误 ...它在 ipython 上下文中做了一些有趣的事情。这已在最新版本的 Django 中得到修复。如果我能找到参考,我会发布作为答案。在 Django 上有一张关于它的 bug 票 -
@chepner 你有任何引用来支持你的 lambda 名称可见性声明吗?经验证据表明 lambda 会看到定义它们的上下文(如常规函数),而不是调用它们的上下文(在 2.7.5 和 3.3.0 中)。