89

当“解构”一个元组时,我可以_用来表示我不感兴趣的元组元素,例如

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

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

4

7 回答 7

122

我刚刚想到的一个有趣的方法是删除变量:

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

这有很多优点:

  • 在调用函数时,仍然可以使用未使用的变量作为位置参数和关键字参数。
  • 如果您稍后开始使用它,您将无法使用它,因为它已被删除,因此出错的风险较小。
  • 这是标准的python语法。
  • PyCharm 做对了!(截至 2020 年,PyCharm 不再做正确的事 :( 在https://youtrack.jetbrains.com/issue/PY-39889跟踪此问题)
  • PyLint 不会抱怨,使用PyLint 手册del中推荐的解决方案。
于 2013-02-12T15:32:30.763 回答
67

下划线用于我们不关心的事情,*args 中的 * 表示参数列表。因此,我们可以使用 *_ 来表示我们不关心的事物的列表:

def foo(bar, *_):
    return bar

它甚至通过了 PyCharm 的检查。

于 2016-03-20T21:56:59.010 回答
48

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

def f(a, _b, _c):
于 2018-04-02T11:28:28.260 回答
36

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

def f(a, *unused):
    return a
于 2012-04-05T09:13:02.120 回答
1

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

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

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

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

于 2020-01-29T11:05:44.807 回答
0

如果你有 args 和关键字 arg 你应该使用

def f(a, *args, **kwargs):
    return a
于 2012-04-05T09:19:01.790 回答
0

我认为接受的答案很糟糕,但它仍然可以工作,如果你使用我应该称之为“Perl 方式”来处理参数(我真的不知道 Perl,但我在看到sub语法后不再尝试学习它,手动参数解包):

你的函数有 3 个参数 - 这是它被调用的(鸭子打字,还记得吗?)。所以你得到:

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),并且每次都手动解析参数。想象一下给您带来的控制水平。在更改“签名”(参数计数和含义)后以不推荐的方式调用时不再有例外。这是值得考虑的事情;)

于 2015-01-07T10:13:56.527 回答