“\*_”是忽略 Python 参数的可接受方式吗?

新手上路,请多包涵

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

澄清我的意思:

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

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

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

原文由 Danny Staple 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 592
2 个回答

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

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

构建 n 空有序集的列表。 _ 是索引,但未使用; _ 通常按需要使用,但未使用,变量名(不仅在 Python 中)。这只是一个棘手的 Python 习惯用法,因为没有内置语法可以做到这一点。

在其他语言中看到这种情况并不少见(其中 _ 是一个有效的标识符)。 _ 通常表示变量对其值不感兴趣,但出于句法原因需要它。

请注意,作为宏调用的 _(...) 具有另一个常规含义,它来自 gettext,其中使用 _("string literal") 来指示需要本地化的字符串。

ActivesState 读取的线程

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


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

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

所以我的理解是,如果我在你的代码中看到这个函数 _ 成语,这个函数只使用 ab .

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

原文由 Rahul Gautam 发布,翻译遵循 CC BY-SA 4.0 许可协议

*_ 表示多个占位符,就像你写的 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]

一个词:首选 *_ 以获得更 健壮 的代码。

原文由 Rafael 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏