0

0

如何让函数的参数顺序可以随意(全部关键字参数)

冷炫風刃

冷炫風刃

发布时间:2026-01-21 20:02:55

|

435人浏览过

|

来源于php中文网

原创

最直接的方式是使用强制关键字参数,后所有参数必须以关键字形式传入且顺序无关;如def calc(*, a, b, op)只接受calc(a=1,b=2,op='add')等任意顺序的关键字调用。

如何让函数的参数顺序可以随意(全部关键字参数)

让函数的参数顺序可以随意,最直接的方式是**全部使用关键字参数(keyword-only arguments)**,并配合 * 占位符强制约束调用方式。

* 定义纯关键字参数

在函数定义中,把 * 放在参数列表中间或开头,它之后的所有参数都变成关键字参数——调用时必须显式写参数名,且顺序无关。

  • 错误写法(位置参数混用): calc(10, 2, 'add') —— 若已加 *,会报错 TypeError: calc() takes 0 positional arguments but 3 were given
  • 正确写法(全关键字、顺序自由): calc(op='add', a=10, b=2)calc(b=2, op='add', a=10) 都合法

完整示例:定义与调用

以下函数只接受关键字参数,且无位置参数干扰:

def calc(*, a, b, op):
    if op == 'add':
        return a + b
    elif op == 'mul':
        return a * b
    else:
        raise ValueError("op must be 'add' or 'mul'")

调用时任意顺序均可:

  • calc(a=5, b=3, op='mul')
  • calc(op='add', b=-1, a=100)
  • calc(b=0, a=42, op='add')

进阶:混合使用(带默认值的关键字参数)

你还可以在 * 后添加带默认值的参数,它们也属于关键字参数,调用时可省略:

a0.dev
a0.dev

专为移动端应用开发设计的AI编程平台

下载
def send_email(*, to, subject, body, cc=None, priority='normal'):
    print(f"To: {to}, Subject: {subject}, Priority: {priority}")

调用示例:

  • send_email(to='a@b.com', subject='Hi', body='Hello') —— ccpriority 使用默认值
  • send_email(body='Urgent!', priority='high', to='x@y.com', subject='Alert') —— 顺序完全打乱,依然有效

为什么不用 **kwargs

**kwargs 虽然允许任意关键字传入,但会失去参数校验和明确接口:

  • 无法保证 abop 一定存在
  • IDE 和类型检查工具(如 mypy)无法推断参数要求
  • 函数签名不清晰,调用者需查源码才能知道要传什么

* + 明确参数名的方式,既保灵活性,又保健壮性和可读性。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1049

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

86

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

455

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

11

2026.01.19

alert怎么实现换行
alert怎么实现换行

alert通过使用br标签来实现换行。更多关于alert相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

491

2023.11.07

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

3

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

13

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号