当“解构”元组时,我可以使用
_
来表示我不感兴趣的元组元素,例如
>>> 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
还有其他方法可以达到同样的效果吗?
刚刚想到的一个搞笑的办法就是删除变量:
def f(foo, unused1, unused2, unused3):
del unused1, unused2, unused3
return foo
这有很多优点:
del
是 PyLint 手册中推荐的解决方案。下划线用于表示我们不关心的东西,*args 中的 * 表示一个参数元组。因此,我们可以使用 *_ 来表示我们不关心的事物的元组:
def foo(bar, *_):
return bar
更新类型提示:
from typing import Any, Tuple
def foo(bar: Any, *_: Tuple[Any, ...]) -> Any:
return bar
您可以使用 '_' 作为前缀,这样 pylint 将忽略这些参数:
def f(a, _b, _c):
这是我对未使用的参数所做的:
def f(a, *unused):
return a
为了避免未使用的 *args 和/或 **kwargs 的“未使用变量”检查消息,我将
args
和 kwargs
替换为 _
和 __
:
def f(a, b, *_, **__):
...
除了删除消息,它清楚地表明你不关心这些论点。
我不能说它是否是一个真正通用的解决方案,但它在我使用到现在的所有地方都有效。
如果您同时拥有 args 和关键字 arg,您应该使用
def f(a, *args, **kwargs):
return a
我认为接受的答案不好,但它仍然可以工作,如果你使用我应该称之为“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)
,然后每次都手动解析参数。想象一下给您的控制级别。在更改“签名”(参数计数和含义)后以不推荐的方式调用时不再有异常。这是值得考虑的事情;)
您可以使用“*_”来使用多个未使用的参数
def test(x, *_):
return x