You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何部分Python嵌套内部函数定义为`def _():`且难寻调用处?

关于Python中以下划线_命名嵌套内部函数的疑问

我了解Python中内部函数前缀加_用于标识其为辅助/内部函数,这对工具链等也有帮助。但我发现部分嵌套内部函数直接以_作为函数名,甚至无法找到其调用位置。例如JAX仓库中的这段代码:

def run_on_first_core(core_axis_name: str):
  """Runs a function on the first core in a given axis."""
  num_cores = jax.lax.axis_size(core_axis_name)
  if num_cores == 1:
    return lambda f: f()

  def wrapped(f):
    core_id = jax.lax.axis_index(core_axis_name)

    @pl_helpers.when(core_id == 0)
    @functools.wraps(f)
    def _(): ## 这个函数是怎么被调用的?
      return f()

  return wrapped

内部代码库中也存在不少此类情况:

  • 在JAX代码库中搜索def _():能找到大量此类示例
  • JAX的TPU分布式文档示例中也存在这种写法

这种以下划线_命名的函数,本质是装饰器的隐式调用。这里的@pl_helpers.when(core_id == 0)是一个装饰器,装饰器的工作逻辑会接收被装饰的函数(也就是这个_函数),并在满足条件时自动调用它。

具体到这段代码的执行逻辑:

  1. run_on_first_core返回的wrapped函数会接收用户传入的目标函数f
  2. 定义的_()函数被@pl_helpers.when(...)装饰后,装饰器内部会处理它的执行时机:当core_id == 0(即当前是第一个核心)时,自动调用_(),进而执行用户传入的f()
  3. 因为不需要在代码中显式调用这个函数,所以不需要给它起有意义的名字,用_作为占位符既符合内部函数的约定,又简洁明了

另外,在Python中_本身就是常用的占位符名称,用来表示“不需要关心具体名字的对象”,这种用法在嵌套函数配合装饰器实现控制流的场景中很常见,尤其是JAX这类依赖装饰器处理分布式、条件执行的框架里。

内容的提问来源于stack exchange,提问作者A. K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:21:13