惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
WordPress大学
WordPress大学
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
L
LangChain Blog
雷峰网
雷峰网
D
DataBreaches.Net
博客园 - 三生石上(FineUI控件)
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
NISL@THU
NISL@THU
Scott Helme
Scott Helme
量子位
S
Security Affairs
T
Threat Research - Cisco Blogs
博客园_首页
云风的 BLOG
云风的 BLOG
D
Docker
AWS News Blog
AWS News Blog
腾讯CDC
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
U
Unit 42
Recent Announcements
Recent Announcements
Apple Machine Learning Research
Apple Machine Learning Research
G
Google Developers Blog
T
The Exploit Database - CXSecurity.com
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 热门话题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Last Watchdog
The Last Watchdog
C
Cybersecurity and Infrastructure Security Agency CISA
IT之家
IT之家
W
WeLiveSecurity
P
Privacy & Cybersecurity Law Blog
F
Full Disclosure
L
Lohrmann on Cybersecurity
The Hacker News
The Hacker News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Y
Y Combinator Blog
S
Security @ Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Check Point Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
N
News and Events Feed by Topic
PCI Perspectives
PCI Perspectives
I
InfoQ

博客园 - 箫笛

Tkinter - Entry 输入框组件 Tkinter - Button 组件 Tkinter - Label 组件 Tkinter - tk 变量 Tkinter - 事件与绑定 Tkinter - 几何管理器 Tkinter - 核心概念 Tkinter - 快速开始 Tkinter - 介绍 Python 编程 - 条件表达式 shell 编程 - shell 脚本的交互方式 Python insall - macOS 系统安装python的几种方式 Miniconda - Python 环境管理工具 Tkinter - Python GUI 开发 Python 编程 - 下划线命名的区别 Python 编程 - 元类编程 Python 编程 - 多重继承与MRO Python 编程 - 描述符协议 Python 编程 - 类型注解 Python 编程 - 生成器表达式 Python 编程 - 集合 Python 编程 - 装饰器 Python 编程 - 闭包 Python 编程 - 列表推导式 Python 编程 - 函数式编程 Python 编程 - lambda 函数 Python 编程 - 文件操作 Python 编程 - 输入与输出 Python 编程 - 面向对象编程 Python 编程 - 元组(tuple) Python 编程 - 字符串(str) Python 编程 - 字典(dict) Python 编程 - 列表(list) Python 编程 - 数据类型和数据结构 Python 编程 - 语句 Python 编程 - 函数 windows - WSL 的安装与使用 shell编程 - dialog 程序使用指南 FE Team - 如何做好前端代码审查 git 提交的撤销和恢复 React15 - redux-saga 如何在saga中实现轮询接口调用? React15 - React CSS Modules BEM命名实践 React15 - React 15 中 componentWillReceiveProps 为什么会多次调用, 同时componentDidUpdate 也会多次调用? React15 - React15类组件多次执行render方法的原因? React15 - React15应用中代码逻辑复用方案 React15 - React状态同步问题解决 React15 - React 15 中 React.pureComponent 的使用场景 React15 - React 15应用在页面渲染时会多次执行类组件的render 函数的原因 React15 - React 15 中能用 componetDidUpdate 代替 componentWillReceiveProps 吗? React15 - React 15 生命周期函数详解 React15 - 如何在React 15中实现自定义的事件订阅与发送(例如组件间通信) React15 - React15应用中的事件订阅和发送机制 React15 - CSS中的BEM规范 React15 - React CSS Modules BEM命名实践 React15 - 写sass 样式文件,嵌套的结构好,还是扁平的结构好? React15 - sass 中 @mixin 和 @extend 的区别是什么? React15 - React 15 应用 如何使用Css moudules 方式进行模块化开发 React15 - React15应用Sass使用指南 React15 - React 15 应用如何进行性能优化?
Python 编程 - 星号下划线参数释义
箫笛 · 2026-07-05 · via 博客园 - 箫笛

在 Python 3 中,函数参数中的 *_ 主要有两种完全不同的理解方式,具体取决于它出现在函数定义中还是函数调用/解包中。

场景一:在函数定义中(def func(*_):)—— 收集并忽略多余的位置参数

这是最常见的用法。这里的 * 是“可变位置参数”语法(类似 *args),而 _ 是变量名(下划线)。

  • 作用:将所有传入的多余的位置参数打包成一个元组(Tuple),赋值给变量 _
  • 潜台词_ 是 Python 中约定俗成的“无关紧要变量”(Don't care variable)。合起来 *_ 的意思就是:“我接受任意数量的位置参数,但我根本不在乎它们是什么,直接丢掉”。

示例代码:

def log_message(msg, *_):
    # 只打印第一个参数,后面的全部忽略
    print(f"Log: {msg}")

log_message("Error", "details", 123, "extra")
# 输出: Log: Error
# 后面的 "details", 123, "extra" 被 *_ 吃掉并丢弃了

常见使用场景:

  • 继承/重写父类方法:当子类不需要父类的某些参数,但又必须保持签名兼容时。
  • 回调函数:某些库会传递很多参数给回调函数,但你只需要前两个。
  • 解耦:明确告诉阅读代码的人:“这些参数我用不到,别管它们”。

场景二:在函数定义中(def func(arg, *, _=None):)—— 强制关键字参数

这里的 * 单独出现,后面跟着参数 _。在 Python 3 中,* 单独使用时表示分隔符,它强制其后面的所有参数必须以关键字参数(key=value)的形式传递。

  • 作用_ 变成了一个普通的可选参数,但必须写成 _=xxx 才能传值。
  • 潜台词:API 设计者不想让你按位置乱传值,必须显式指明参数名。

示例代码:

def register_user(name, *, _=None):
    print(f"Name: {name}, Extra: {_}")

# 正确调用(必须写 _=)
register_user("Alice", _="admin")

# 错误调用(会报错,因为位置参数太多了)
# register_user("Alice", "admin")  
# TypeError: register_user() takes 1 positional argument but 2 were given

场景三:在函数调用中(func(*_))—— 解包序列

如果 _ 是一个列表或元组,在调用函数时写 func(*_),这是序列解包操作。

  • 作用:将列表/元组 _ 中的元素拆开,作为位置参数依次传入函数。
  • 注意:这里的 *_ 不是定义参数,而是传入参数

示例代码:

def add(a, b, c):
    return a + b + c

params = [1, 2, 3]
result = add(*params)  # 等同于 add(1, 2, 3)
print(result)  # 输出 6

总结速查表

写法位置 语法含义 实际效果
def func(*_) 可变位置参数 + 丢弃变量 收集所有多余位置参数并忽略,常用于忽略无用入参。
def func(_, *, _)def func(*, _) 强制关键字参数分隔符 后面的 _ 必须用关键字传值(_=xxx)。
func(*_) (调用时) 序列解包(星号表达式) _ 里的元素拆开当作多个参数传进去。

如果你是在看某个开源框架(如 PyTorch、Django)的源码,看到的 *_,99% 是“场景一”,表示“我接受参数但我选择忽略它们”,目的是为了兼容接口或占位。