以pythonic方式重新定义函数?(Flake8 F811 错误)



我正在尝试用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

最新更新