【问题标题】:Using an imported function inside lambda - Python在 lambda 中使用导入的函数 - Python
【发布时间】: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 中)。

标签: python django lambda


【解决方案1】:

参考这里:https://code.djangoproject.com/ticket/18204

(在 Django 1.6 中修复)

另请参阅:
https://stackoverflow.com/a/19004592/202168
https://github.com/ipython/ipython/issues/2532/

我在这里发布这个是因为我经常遇到这个问题(而且这两个 cmets 似乎与 shell 相关),尽管 OP 根本没有说明它们在 Django shell 中,所以这个答案可能是无关紧要的。

【讨论】:

  • 我只在 shell 中尝试过,但从未意识到这可能是 shell 中的错误。
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
相关资源
最近更新 更多