Python名称错误: 全局名称'any'未定义。

5

我的生产服务器出现如下错误:

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"函数改写以解决问题吗?

7
从堆栈跟踪中可以看出,您的服务器似乎正在运行Python 2.4,该版本不支持any - Michael Mior
哎呀,有什么建议可以重写这段代码以使其与Python2.4兼容吗? - Darwin Tech
@Ned 似乎给出了一个很好的答案。虽然如果可能的话,我真的会考虑升级。下一个版本的 Django(1.4)将不支持 Python 2.4。 - Michael Mior
2个回答

11

实际上,您正在运行Python 2.4版本,该版本没有内置的any函数。

如果需要定义自己的any函数,很容易:

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

3

我也遇到了这个Python错误,出现在以下代码行:

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

这里有一个解决方案,不需要重新定义any函数:

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

统计True的数量,然后断言它大于0与使用any函数是相同的。但这种方法可能略微低效,因为它需要进行完整的列表扫描,而不是在发现True时立即退出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接