Почему Python дает мне "TypeError: аргумент типа" UserAgent "не повторяется" в операции без итераций?

У меня есть класс BaseHandler, который подклассов Tipfy RequestHandler на моем сайте AppEngine. В нем я настроил анализатор браузера "бедняга" для мобильных устройств с атрибутом класса (кортеж), содержащим имена устройств.

В последующем методе я перебираю имена устройств в кортеже и проверяю их по строке пользовательского агента из объекта Request. Если я получаю совпадение, я устанавливаю атрибут экземпляра с именем is_mobile в True.

В этом методе, однако, Python выдает мне ошибку "TypeError: аргумент типа" UserAgent "не повторяется", и я не могу понять, почему, поскольку строка, на которую он жалуется, нет (насколько я понимаю) цикл.

Вот код:

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 ответ

Решение

Выражение

device in self.request.user_agent

сначала попробую позвонить

self.request.user_agent.__contains__(device)

Если этот метод не существует, Python пытается перебрать self.request.user_agent и сравнивает каждый элемент, с которым он сталкивается device, Очевидно, тип self.request.user_agent ни один не позволяет .__contains__() ни итерации, отсюда и сообщение об ошибке.

Также см. Документацию теста членства в Python.

Другие вопросы по тегам