如何表示未使用的函数参数?

问题描述 投票:0回答:8

当“解构”元组时,我可以使用

_
来表示我不感兴趣的元组元素,例如

>>> a,_,_ = (1,2,3)
>>> a
1

使用 Python 2.x,我如何用函数参数表达相同的内容?我尝试使用下划线:

>>> def f(a,_,_): return a
...
  File "<stdin>", line 1
SyntaxError: duplicate argument '_' in function definition

我也试图完全省略论点:

>>> def f(a,,): return a
  File "<stdin>", line 1
    def f(a,,): return a
        ^
SyntaxError: invalid syntax

还有其他方法可以达到同样的效果吗?

python python-2.x
8个回答
142
投票

刚刚想到的一个搞笑的办法就是删除变量:

def f(foo, unused1, unused2, unused3):
    del unused1, unused2, unused3
    return foo

这有很多优点:

  • 未使用的变量在调用函数时仍然可以作为位置参数和关键字参数使用。
  • 如果你以后开始使用它,你不能因为它被删除了,所以出错的风险更小。
  • 这是标准的 python 语法。
  • PyCharm 做正确的事! (截至 2020 年,PyCharm 不再做正确的事 :( 在 https://youtrack.jetbrains.com/issue/PY-39889 跟踪这个)
  • PyLint 不会抱怨,使用
    del
    PyLint 手册中推荐的解决方案

80
投票

下划线用于表示我们不关心的东西,*args 中的 * 表示一个参数元组。因此,我们可以使用 *_ 来表示我们不关心的事物的元组:

def foo(bar, *_):
    return bar

更新类型提示:

from typing import Any, Tuple

def foo(bar: Any, *_: Tuple[Any, ...]) -> Any:
    return bar

59
投票

您可以使用 '_' 作为前缀,这样 pylint 将忽略这些参数:

def f(a, _b, _c):

39
投票

这是我对未使用的参数所做的:

def f(a, *unused):
    return a

3
投票

为了避免未使用的 *args 和/或 **kwargs 的“未使用变量”检查消息,我将

args
kwargs
替换为
_
__

def f(a, b, *_, **__):
    ...

除了删除消息,它清楚地表明你不关心这些论点。

我不能说它是否是一个真正通用的解决方案,但它在我使用到现在的所有地方都有效。


0
投票

如果您同时拥有 args 和关键字 arg,您应该使用

def f(a, *args, **kwargs):
    return a

0
投票

我认为接受的答案不好,但它仍然可以工作,如果你使用我应该称之为“Perl 方式”的处理参数(我真的不了解 Perl,但在看到

 sub
语法,手动解包参数):

你的函数有 3 个参数——这就是它被调用的参数(Duck typing,还记得吗?)。所以你得到:

def funfun(a, b, c):
    return b * 2

2 未使用的参数。但是现在,输入改进的 larsmans 方法:

def funfun(*args):
    return args[1] * 2

还有警告......

不过,我还是比较喜欢盒装的样子:

def funfun(a, b, c):
    del a, c
    return b * 2

保持参数名称的自文档质量。它们是一个特性,而不是一个错误。

但是,语言本身并没有强迫你去那里——你也可以反过来,让你所有的函数都有签名

(*args, **kwargs)
,然后每次都手动解析参数。想象一下给您的控制级别。在更改“签名”(参数计数和含义)后以不推荐的方式调用时不再有异常。这是值得考虑的事情;)


0
投票

您可以使用“*_”来使用多个未使用的参数

def test(x, *_):
    return x
© www.soinside.com 2019 - 2024. All rights reserved.