重新定义功能的Pythonic方法? (Flake8 F811错误)

时间:2018-09-12 16:28:07

标签: python flake8

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

但是感觉不对。有谁有更好的主意吗?

1 个答案:

答案 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