2011-03-13 2 views
1

AppEngine 사이트에서 Tipfy RequestHandler를 서브 클래 싱하는 BaseHandler 클래스가 있습니다. 그 안에는 장치 이름이 들어있는 클래스 속성 (튜플)을 가진 모바일 장치 용 "불쌍한 사람의"브라우저 스니퍼가 설치되어 있습니다.왜 파이썬이 비 반복 유형의 연산에서 "TypeArror : 유형 'UserAgent'인수가 반복 가능하지 않은가?

후속 방법에서 튜플의 장치 이름을 반복하여 요청 개체의 사용자 에이전트 문자열과 비교합니다. 일치하는 항목이 있으면 "is_mobile"이라는 인스턴스 속성을 True로 설정합니다.

그러나 그 방법에서는 파이썬이 나에게 "TypeArror : 타입 'UserAgent'인수가 반복 가능하지 않습니다"오류를주었습니다. 그리고 그 이유에 대해 불평하는 행이 (멀리까지 내가 이해하는 한) 루프.

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

답변

5

표현

device in self.request.user_agent 

전화를 먼저 시도합니다

self.request.user_agent.__contains__(device) 
을 : 여기
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 

파이썬은 좋아하지 않는 줄 수 있습니다 : 여기

코드입니다

이 메서드가 존재하지 않으면 파이썬은 self.request.user_agent을 반복하고 각 항목을 device과 비교합니다. 분명히 self.request.user_agent 유형은 .__contains__()이나 반복을 허용하지 않으므로 오류 메시지가 표시됩니다.

the documentation of membership test in Python도 참조하십시오.

+0

감사합니다. 나는 그것을 깨닫지 못했다. – tommytwoeyes