39

如果我有一个函数/方法是某个框架的回调的实现,并且不关心任何进一步的参数,它似乎在语法上是正确的,并且没有 pylint/IDE 投诉可用于*_表达对任何内容不感兴趣进一步的论点。我认为的重点是向工具和其他开发人员表达这些论点目前不相关的意图。

为了澄清我的意思:

def my_callbacK_handler(a, b, *_):
    ...

我还没有看到这个成语在野外使用 - 它是否常见,是否有示例,是否存在已知问题?

对于那些不熟悉的人:_表达我对该符号不感兴趣的意图 - 它是 IDE 和 linter 识别的 Python“虚拟”。

4

3 回答 3

40

_与其他变量一样,它只是一个变量,但按照惯例,这意味着您不打算使用该值,只需声明并忘记它。

[OrderedSet() for _ in xrange(n)]

构建一个n空有序集的列表。_是索引,但未使用;_通常根据需要使用,但未使用的变量名(不仅在 Python 中)。这只是一个棘手的 Python 习惯用法,因为没有内置语法来执行此操作。

在其他语言中看到这种情况并不少见(_有效标识符在哪里)。_通常意味着变量的值不感兴趣,但出于句法原因需要。

请注意,_(...)宏调用具有另一种传统含义,它来自 gettext,_("string literal")用于指示需要本地化的字符串。

ActivesState中读取的线程

我不能说任何问题,Python内部没有使用它,它只是一个变量,是我们要小心。


关于* 和 ** 的语法:名称*args**kwargs只是约定俗成的,但没有必要不使用它们。

def my_callbacK_handler(a, b, *_):
    ...

因此,如果我通过_成语在您的代码中看到此函数,我的理解是,该函数仅在其工作中使用ab参数,而将忽略其他函数。

正如您所说:*_表示对任何进一步的论点不感兴趣”

于 2012-12-05T15:19:02.383 回答
4

*_表示多个占位符,就像您编写的那样def my_callbacK_handler(a, b, _,_,_....,_):,并将创建一个名为的变量,该变量_是额外参数的列表

它有两个优点:

  1. 它可以处理没有额外参数的情况
def f(): 
   return 1,2,3 

def g(): 
   return 1,2

def h(): 
   return 1,2,3,4

_作为占位符只能处理一个值

x,y,_ = g() # ValueError: not enough values to unpack (expected 3, got 2)

x,y,_ = h() # ValueError: too many values to unpack (expected 3)

*_可以处理任意数量的值

x,y,*_ = g()                                                                                                                  

print(_)                                                                                                                      
[]

x,y,*_ = h()                                                                                                                  

print(_)                                                                                                                      
[3, 4]

一句话:更喜欢*_健壮的代码。

于 2021-04-07T15:42:40.517 回答
0

让我简单地添加一个例子:

>>> *_, a = [1,2,3]
>>> _, a
([1, 2], 3)


>>> _, a = [1,2,3]
Traceback (most recent call last):
  File "<console>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
于 2021-12-07T21:20:48.337 回答