Pythonic способ переопределить функцию? (Flake8 F811 ошибка) - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь написать модуль оболочки загрузчика на python, который может использовать запросы pycurl, selenium или good-ol 'для загрузки URL-адреса в соответствии с

# import pycurl inside a try-except block, logging errors
# also import selenium stuff inside a try-except block logging errors
# then
def pycurl_downloader(*args, **kwargs):
    raise NotImplementedError

if 'pycurl' in sys.modules:
    def pycurl_downloader(url, char_encoding=None):
        # actual implementation, now we are certain pycurl is there

# similar for selenium

тогда, когда сайтне использует глупый DOM-модифицирующий JavaScript, я мог бы просто использовать pycurl (или, если он не найден, откат к запросам изящно), в противном случае использовать различные драйверы селена (снова с изящным отступлением при сбое драйвера).

Но flake8 жалуется на ошибку переопределения F811 (переопределение pycurl_downloader и также selenium_downloader позже) в приведенном выше коде.

Я мог бы попытаться использовать некоторую пустышку _not_implemented_function и присвоить ей имя pycurl_downloader, а затем написатьфункцию _real_pycurl_downloader и переназначить:

pycurl_downloader = _not_implemented_func
if 'pycurl' in sys.modules:
    def _real_pycurl_downloader(...):
        # blah
    pycurl_downloader = _real_pycurl_downloader

, но это не так.У кого-нибудь есть идея получше?

1 Ответ

0 голосов
/ 12 сентября 2018

Использование if - else для определения функции только один раз должно отключить flake8:

if 'pycurl' in sys.modules:
    def pycurl_downloader(url, char_encoding=None):
        # actual implementation, now we are certain pycurl is there
        ...
else:
    def pycurl_downloader(*args, **kwargs):
        raise NotImplementedError
...