我正在尝试用python编写一个下载程序包装器模块,该模块可能会使用pycurl,硒或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
但是感觉不对。有谁有更好的主意吗?
答案 0 :(得分:1)
使用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