如果我有一个函数/方法是一个框架的回调实现,并且不关心任何进一步的参数,它似乎在语法上是正确的,并且没有pylint / IDE投诉使用* _来对任何进一步的论点都不感兴趣。我认为这一点是要向工具和其他开发人员表达这些参数当前不相关的意图。
澄清我的意思是:
def my_callbacK_handler(a, b, *_):
...
我似乎没有在野外使用这个习惯用法 - 这是常见的,是否有例子,并且已知有这个问题?
对于那些不熟悉的人 - “_”表达了我对该符号不感兴趣的意图 - 它是由IDE和linters识别的python“虚拟”。
答案 0 :(得分:21)
它只是一个变量,就像其他任何变量一样,但按照惯例,它意味着 如果您不打算使用该值,只需声明并忘记它。
[OrderedSet() for _ in xrange(n)]
构建n个空有序集的列表。 _
是索引,但未使用; _
通常根据需要使用,但未使用的变量名称(不仅在python中)。
这只是一个棘手的python习惯用法,因为没有内置语法来执行此操作。
在其他语言中看到这种情况并不罕见(其中_是有效的标识符)。 _经常 意味着变量对价值不感兴趣,但是对 出于句法原因需要。
请注意,_(...)
作为宏调用具有另一种常规含义,即
来自gettext,其中一个使用_("string literal")
来表示a
需要本地化的字符串。
我不能说任何问题,python不在内部使用它,它只是一个变量,我们必须要小心。
更新:
The syntax is the * and **。名称* args和** kwargs仅按惯例,但不需要使用它们。
def my_callbacK_handler(a, b, *_):
...
所以我理解如果我在你的代码中通过_ idiom看到这个函数,这个函数在它的工作中只使用a和b参数,并且会忽略其他函数。
正如你所说“* _表示对任何进一步的论点没有兴趣”
答案 1 :(得分:1)
*_
表示多个占位符,就像你写 def my_callbacK_handler(a, b, _,_,_....,_):
一样,会创建一个名为 _
的变量,它是一个额外参数的列表
它有两个优点:
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]
一句话:更喜欢_*
以获得更健壮的代码。