Переопределение метода Python Mechanize.Browser.open () - PullRequest
1 голос
/ 26 февраля 2012

следующий код:

#!/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 с механизацией 0.2.5.

1 Ответ

2 голосов
/ 26 февраля 2012

Основное различие между первым фрагментом кода и двумя другими состоит в том, что метод 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)

У вас не должно быть этой проблемы.

...