为何部分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)是一个装饰器,装饰器的工作逻辑会接收被装饰的函数(也就是这个_函数),并在满足条件时自动调用它。
具体到这段代码的执行逻辑:
run_on_first_core返回的wrapped函数会接收用户传入的目标函数f- 定义的
_()函数被@pl_helpers.when(...)装饰后,装饰器内部会处理它的执行时机:当core_id == 0(即当前是第一个核心)时,自动调用_(),进而执行用户传入的f() - 因为不需要在代码中显式调用这个函数,所以不需要给它起有意义的名字,用
_作为占位符既符合内部函数的约定,又简洁明了
另外,在Python中_本身就是常用的占位符名称,用来表示“不需要关心具体名字的对象”,这种用法在嵌套函数配合装饰器实现控制流的场景中很常见,尤其是JAX这类依赖装饰器处理分布式、条件执行的框架里。
内容的提问来源于stack exchange,提问作者A. K.
相关产品推荐
相关产品推荐

