【问题标题】:Python NameError: global name 'any' is not definedPython NameError:未定义全局名称“任何”
【发布时间】:2012-01-27 17:57:19
【问题描述】:

我在生产服务器上收到以下错误:

Traceback (most recent call last):

 File "/usr/lib/python2.4/site-packages/django/core/handlers/base.py", line 89, in get_response
response = middleware_method(request)
 File "myproject/middleware.py", line 31, in process_request
if not any(m.match(path) for m in EXEMPT_URLS):

NameError: global name 'any' is not defined

服务器正在运行 python 2.6,并且在开发中未引发此错误。违规代码在middleware.py:

...
if not request.user.is_authenticated():
        path = request.path_info.lstrip('/')
        if not any(m.match(path) for m in EXEMPT_URLS):
            return HttpResponseRedirect(settings.LOGIN_URL)

我应该重写这个any 函数来解决这个问题吗?

【问题讨论】:

  • 从堆栈跟踪中,您的服务器似乎正在运行 Python 2.4,它没有 any。
  • 哎呀。哦耶。有什么建议我如何重写代码以与 python2.4 兼容?
  • @Ned 似乎给出了一个很好的答案。尽管如果可能的话,我真的会考虑升级。下一个版本的 Django (1.4) 将不支持 Python 2.4。

标签: python any


【解决方案1】:

您实际上是在没有 any 内置函数的 Python 2.4 上运行的。

如果你需要定义自己的any,很简单:

try:
    any
except NameError:
    def any(s):
        for v in s:
            if v:
                return True
        return False

【讨论】:

    【解决方案2】:

    我也收到了这个 Python 错误:

    >>> any([False, True, False])
    Error:'any' is not defined
    

    这是一个无需重新定义 any 函数的解决方法:

    >>> [False, True, False].count(True) > 0
    True
    

    计算 True 的数量然后断言它大于 0 与 any 函数执行相同的操作。它的效率可能会稍低一些,因为它需要完整的列表扫描,而不是在找到 True 后立即中断。

    【讨论】:

      猜你喜欢
      • 2013-08-23
      • 1970-01-01
      • 2013-07-20
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多