我正在尝试用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(或者如果没有找到,则优雅地回退到请求(,否则使用各种Selenium驱动程序(如果驱动程序失败,则再次优雅地回退(。
但是 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
但这感觉不对。 有人有更好的主意吗?
使用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