为什么Python在非迭代操作中给我“TypeError: argument of type 'UserAgent' is not iterable”?
我有一个叫做 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 中关于成员测试的文档。