为什么Python在非迭代操作中给我“TypeError: argument of type 'UserAgent' is not iterable”?

1 投票
1 回答
1523 浏览
提问于 2025-04-16 13:36

我有一个叫做 BaseHandler 的类,它是我在 AppEngine 网站上使用的 Tipfy RequestHandler 的子类。在这个类里,我设置了一个简单的浏览器检测器,用来识别移动设备,这个检测器用一个包含设备名称的元组来表示。

在后面的一个方法中,我会遍历这个元组里的设备名称,并将它们与请求对象中的用户代理字符串进行比较。如果找到匹配的设备名称,我就会把一个叫做 "is_mobile" 的实例属性设置为 True,表示这是一个移动设备。

不过,在这个方法中,Python 报了一个错误:“TypeError: argument of type 'UserAgent' is not iterable”,我不明白为什么会这样,因为它抱怨的那行代码在我看来并不是一个循环。

以下是代码:

class BaseHandler(RequestHandler, AppEngineAuthMixin, AllSessionMixins):

    mobile_devices = ('Android', 'iPhone', 'iPod', 'Blackberry')

    ....

    def detect_mobile_devices(self):
        found_device = False

        for device in self.__class__.mobile_devices:
            if device in self.request.user_agent:
                found_device = True
                break

        self.is_mobile = found_device

这是 Python 不喜欢的那一行:

File "/path/to/project/app/apps/remember_things/handlers.py", line 56, in detect_mobile_devices
if device in self.request.user_agent:

1 个回答

5

这个表达式

device in self.request.user_agent

首先会尝试调用

self.request.user_agent.__contains__(device)

如果这个方法不存在,Python 就会尝试遍历 self.request.user_agent,并把它遇到的每个项目和 device 进行比较。很明显,self.request.user_agent 的类型既不支持 .__contains__() 方法,也不支持遍历,所以就出现了错误信息。

你也可以查看 Python 中关于成员测试的文档

撰写回答