Python:兼容性所需的未使用参数。如何避免皮林特抱怨它

Posted

技术标签:

【中文标题】Python:兼容性所需的未使用参数。如何避免皮林特抱怨它【英文标题】:Python: unused argument needed for compatibility. How to avoid Pylint complaining about it 【发布时间】:2020-03-26 21:32:14 【问题描述】:

对于我使用 Python 编写的代码,我想调用许多带有特定参数的函数。但是,对于某些函数,该参数没有任何作用。不过,出于兼容性原因,我想添加参数。例如,考虑以下最小的工作示例:

def my_function(unused=False):
    """ Function with unused argument. """
    return True

显然,unused 参数没有被使用,所以 Pylint 会抛出一个警告:

W0613: Unused argument 'redundant' (unused-argument)

我的意思是我不想删除参数unused,因为函数my_function 的调用方式与使用unused 的许多其他函数类似 .

我的问题:如何在不删除可选参数的情况下避免来自 Pylint 的警告?

选项 1:我可以想到两个选项,但这些选项并不让我满意。一种选择是添加一些无用的代码,例如使用unused,例如,

def my_function(unused=False):
    """ Function with unused argument. """
    if unused:
        dummy = 10
        del dummy
    return True

这感觉像是在浪费资源,而且只会使代码混乱。

选项2:第二个选项是抑制警告,例如,像这样:

def my_function(unused=False):
    """ Function with unused argument. """
    # pylint: disable=unused-argument
    return True

我也不太喜欢这个选项,因为通常 Pylint 警告是不良风格的标志,所以我更倾向于寻找一种不同的编码方式来避免这个警告。

我还有哪些其他选择?

【问题讨论】:

我相信如果你能提及你打算如何调用这些函数会有所帮助。看起来您希望为一组函数具有一致的签名,以便您可以以类似的方式调用它们。您究竟想如何调用这些函数? 每个函数都在生成交通状况图。我用一个参数来判断是右手驾驶还是左手驾驶(所以上面例子中的unused参数是用来判断我们是使用右手驾驶还是左手驾驶)。然而,对于某些数字,左手驾驶的结果与右手驾驶的结果相同,因此根本不使用该参数。我将所有函数(产生这些数字)分组在一个列表中并一个一个地执行它们。所以在[func(unused=True) for func in [my_function, my_function2]] 线上的东西。这对您有帮助吗? 是的,它有帮助,这意味着参数的名称在所有函数中必须相同,因此不能使用带前导下划线 (_unused) 的技巧。不过,您可能可以使用**kwargs 解决问题。 是的,更改名称不是一种选择。实际上,我已经在考虑**kwargs,尤其是当我将使用更多输入参数时(我认为我最终会这样做)。所以这是你的一个很好的建议。 其实在尝试了一下之后,我不相信使用**kwargs会好很多。 pylint 最终会触发unused-argument 消息,而不是kwargs,而不是unused,另外一个缺点是可读性较差。但也许它更适合您的用例。 【参考方案1】:

我不认为禁用某些 pylint 警告是一种不好的风格,只要它以明确的意图和尽可能具体的方式仔细完成即可。为此,激活useless-suppression 检查很重要。当它处于活动状态时,pylint 会在某些消息无故在本地禁用时发出警告。将此添加到您的.pylintrc

[MESSAGES CONTROL]
enable=useless-suppression

例如,我建议禁用问题的确切发生,如下例所示:

def my_function(
        used,
        unused=False,  # pylint: disable=unused-argument
):
    """ Function with unused argument. """
    return used

添加前导下划线也应防止 pylint 触发:

def my_function(used, _unused=False):
    """ Function with unused argument. """
    return used

另一种常用的模式如下:

def my_function(used, unused_a, unused_b=False):
    """ Function with unused argument. """
    _ = (unused_a, unused_b,)
    return used

【讨论】:

感谢您的回答。我认为您的第一个选项是对我的第二个选项的改进,因为在您的情况下,我们只禁用特定参数的警告,而不是 my_function 的所有参数。所以谢谢你(+1)。在接受你的答案之前,我会稍等片刻,以免其他人没有动力给出其他答案。 下划线前缀对我来说是完美的解决方案,谢谢。 @dhochee 显然,在关键字参数前加上下划线会更改该关键字参数的名称,因此在参数实际需要成为关键字参数。【参考方案2】:

可以通过使用**kwargs 找到解决方案。例如:

def _function_a(one, two=2):
    return one + two

def _function_b(one, **kwargs):
    return one + kwargs['two']

def _function_c(one, **_kwargs):
    return one

def _main():
    for _function in [_function_a, _function_b, _function_c]:
        print(_function.__name__, _function(1, two=4))

【讨论】:

以上是关于Python:兼容性所需的未使用参数。如何避免皮林特抱怨它的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在每个测试文件中导入组件所需的所有内容?

使用特定标志时如何允许省略所需的参数?

如何使用 Ruby OptionParser 指定所需的开关(不是参数)?

如何在单元测试期间测试所需的 argparse 参数?

如何使用 multipartFormData 和参数上传图像,使用 Alamofire 4.3 请求所需的身份验证

如何使用 Axios 将 JSON 数据正确发送到 rails 服务器,以正确匹配所需的 rails 参数哈希?