Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何表示未使用的函数参数?_Python_Python 2.x - Fatal编程技术网

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

Python 如何表示未使用的函数参数?,python,python-2.x,Python,Python 2.x,当“解构”一个元组时,我可以使用\uu来表示我不感兴趣的元组元素,例如 >>> a,_,_ = (1,2,3) >>> a 1 使用Python2.x,如何用函数参数表达相同的内容?我尝试使用下划线: >>> def f(a,_,_): return a ... File "<stdin>", line 1 SyntaxError: duplicate argument '_' in function definition

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

>>> a,_,_ = (1,2,3)
>>> a
1
使用Python2.x,如何用函数参数表达相同的内容?我尝试使用下划线:

>>> def f(a,_,_): return a
...
  File "<stdin>", line 1
SyntaxError: duplicate argument '_' in function definition
>>定义f(a,u,u):返回a
...
文件“”,第1行
SyntaxError:函数定义中存在重复的参数“\u1”
我还试图完全忽略这个论点:

>>> def f(a,,): return a
  File "<stdin>", line 1
    def f(a,,): return a
        ^
SyntaxError: invalid syntax
定义f(a,,):返回a 文件“”,第1行 定义f(a,,):返回a ^ SyntaxError:无效语法
还有其他方法可以达到同样的效果吗?

以下是我如何处理未使用的参数:

def f(a, *unused):
    return a

如果您同时具有arg和关键字arg,则应使用

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

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

def f(foo, unused1, unused2, unused3):
    del unused1, unused2, unused3
    return foo
这有许多好处:

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

我认为公认的答案是错误的,但如果您使用我应该称之为“Perl方式”的方法处理参数,它仍然可以工作(我真的不懂Perl,但在看到
子语法和手动参数解包后,我不再尝试学习它):

您的函数有3个参数-这就是它被调用的参数(Duck类型,记得吗?)。因此您得到:

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
它保持了参数名的自我记录质量。它们是一个特性,而不是一个bug


但是,语言本身并不强迫你这样做——你也可以反过来,让你所有的函数都有签名
(*args,**kwargs)
,并每次手动进行参数解析。想象一下给您带来的控制级别。并且在更改“签名”(参数计数和含义)后以不推荐的方式调用时,不会再有异常。这是值得考虑的;)下划线用于表示我们不关心的事情,而*in*参数表示参数列表。因此,我们可以用*来表示我们不关心的事情的列表:

def foo(bar, *_):
    return bar

它甚至通过了PyCharm的检查。

您可以使用“\uu”作为前缀,以便pylint忽略以下参数:

def f(a, _b, _c):
为了避免未使用*args和/或**kwargs的“未使用变量”检查消息,我将
args
kwargs
替换为

def f(a, b, *_, **__):
    ...
除了删除消息,它清楚地表明您不关心这些参数


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

为什么不为参数设置默认值呢?为什么在函数中会有未使用的参数?@jamylak:我使用的框架要求我在不同的地方传递可调用项。但是,在很多情况下,我实际上并不需要框架传递的所有参数。@FrerichRaabe如果框架需要特定的参数,那么无论函数是否使用这些参数,只要使用框架为每个参数定义的相同名称似乎是最干净的。这也意味着,当您后来发现确实需要其他参数时,您不必更改函数的签名。@jamylak对于一位同事(以及pylint等工具)来说,虽然不清楚这些变量是否有意未使用。所以你最终会添加一些注释——如果可能的话,我想通过在代码中表达来避免这种情况。@jamylak我不赞成建议使用
del
(我自己也不喜欢)的答案,我一直反对给这些论点起一个貌似有理的名字,但后来干脆不使用它们,因为工具和同事们可能会对此(电子)感到惊讶。当然,我总是可以用英文文本来记录我的意图,但我更喜欢用Python来表达。嗯,很好!甚至与lambdas一起工作。然而,如果我想忽略第一个和第三个论点,而不是第二个论点,该怎么办?@FrerichRaabe:那么你仍然必须写出第一个论点。对不起,我明白了。遗憾的是,就我而言,这实际上是我想忽略的第一个(或前两个)论点。不过,您的方法很好,谢谢分享+乔尔科内特:我不确定我是否理解。也许是因为我缺乏Python方面的专业知识——我使用的框架要求我传递一个包含四个参数的可调用函数。框架最终调用了我的函数,比如
f(a,b,c,d)
。它似乎没有明确地命名参数——在这种情况下,在我这边使用
kwargs
会有帮助吗?也许这个框架不太理想,但我能说什么呢?我必须使用我得到的东西。:-}@乔尔科内特:我现在就是这么做的。只是有些参数有很长的名称,所以我考虑将它们缩短为一些东西-比如说,-,这样我就可以看到有一个变量正在被传递-我只是碰巧不需要它(现在)。我非常喜欢这个技巧,并将采用它。我仍然会添加一个小注释,例如
#忽略的参数。
,因为其目的并不是真正“删除”变量。太好了,这是处理前导未使用参数的唯一答案,而不是尾随。其他应被否决或删除;)优化器是否检测到了这一点?@Pepedou目前可能还不是典型的情况。
del
本身负责“释放”参数(因此,如果没有其他引用它,它就有资格进行垃圾收集)。唯一的其他开销是参数传递