【问题标题】:Python: unused argument needed for compatibility. How to avoid Pylint complaining about itPython:兼容性所需的未使用参数。如何避免皮林特抱怨它
【发布时间】: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,另外一个缺点是可读性较差。但也许它更适合您的用例。

标签: python coding-style pylint optional-arguments


【解决方案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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2010-10-12
    • 2019-01-01
    • 2014-12-15
    相关资源
    最近更新 更多