Почему Python дает мне «TypeError: аргумент типа« UserAgent »не повторяется» в операции без итераций? - PullRequest
1 голос
/ 13 марта 2011

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

В следующем методе я перебираю имена устройств в кортеже и проверяюих против строки агента пользователя из объекта запроса.Если я получаю совпадение, я устанавливаю для атрибута экземпляра 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 Ответ

5 голосов
/ 13 марта 2011

Выражение

device in self.request.user_agent

сначала попытается вызвать

self.request.user_agent.__contains__(device)

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

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

...