2012-02-26 3 views
1

Следующий код:Переопределение Python Mechanize.Browser.open() Метод

#!/usr/bin/env python                                  

import mechanize 

class MechanizeSubclass(mechanize.Browser): 
    def __init__(self, 
       factory=None, 
       history=None, 
       request_class=None, 
       ): 
     mechanize.Browser.__init__(self, factory, history, request_class) 

    def open(self, url, data=None, 
      timeout=mechanize._sockettimeout._GLOBAL_DEFAULT_TIMEOUT): 
     mechanize.Browser.open(self, url, data, timeout=timeout) 

subclass = MechanizeSubclass() 
subclass.open('https://uncjobs.northcarolina.edu/applicants/jsp/shared/Welcome_css.jsp') 
print subclass.response().read() 

генерирует ошибку

mechanize._response.httperror_seek_wrapper: HTTP Error 302: Moved Temporarily 

Я смотрел на код механизировать и метод Browser.open() определяется как:

def open(self, url, data=None, 
     timeout=_sockettimeout._GLOBAL_DEFAULT_TIMEOUT): 
    return self._mech_open(url, data, timeout=timeout) 

и если я изменю метод Open() в моем классе чтобы соответствовать этому:

class MechanizeSubclass(mechanize.Browser): 
    ... 
    def open(self, url, data=None, 
     timeout=mechanize._sockettimeout._GLOBAL_DEFAULT_TIMEOUT): 
     return self._mech_open(url, data, timeout=timeout) 

тогда он отлично работает. Но я до сих пор не понимаю, почему первое определение с использованием mechanize.Browser.open (self, url, data, timeout = timeout) не работает. Разве они не должны быть эквивалентными? Это с python 2.6 с mechanize 0.2.5.

ответ

2

Основное отличие между первым фрагментом кода и двумя другими заключается в том, что метод open не возвращает ничего (что в Python совпадает с возвратом объекта None).

То есть, независимо от кода, вызываемого методом open, ожидается, что объект будет возвращен _mech_open. Ваш первый метод просто ничего не возвращает.

Если вы просто изменить первое внедрение в:

class MechanizeSubclass(mechanize.Browser): 
    ... 
    def open(self, url, data=None, 
      timeout=mechanize._sockettimeout._GLOBAL_DEFAULT_TIMEOUT): 
     return mechanize.Browser.open(self, url, data, timeout=timeout) 

Вы не должны иметь эту проблему.

+0

Так оно и было - теперь оно работает. –

Смежные вопросы