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 指定所需的开关(不是参数)?