Page 32 - 《软件学报》2025年第4期
P. 32
1438 软件学报 2025 年第 36 卷第 4 期
种参数. 表 1 展示了 5 种参数的使用特点.
示例代码 1. Python 中 API 的参数.
1 # a 和 b 是位置参数, c 和 d 是默认参数, args 是可变参数, key1 和 key2 是命名关键字参数, kwargs 是关键字参数
2 def foo (a:str, b, c=0, d=0, *args, key1, key2=0, **kwargs):
3 pass
表 1 Python 中 API 的 5 种参数及其特点
参数类别 参数个数 是否有默认值 是否需要传值 传值的顺序 传值的方式
直接传或
位置参数 ≥0 否 是 按定义顺序
以键值对传入
若省略默认参数名称, 按定义顺序; 直接传或
默认参数 ≥0 是 可选
若以键值对形式传值, 无顺序要求 以键值对传入
可变参数 0或1 否 可选 - 直接传
API 处理结果.
命名关键字参数 ≥0 可选 若无默认值, 是; 否则, 可选 无顺序要求 以键值对传入
关键字参数 0或1 否 可选 无顺序要求 以键值对传入
位置参数按照定义的顺序传入值, 如 foo(‘a’, ‘b’, …); 也可以通过键值对的形式依次传入所有参数的值, 如
foo(a=‘a’, b=‘b’, …).
默认参数在未被显式传值时将使用默认值. 传入值时, 可直接按照定义的顺序传值, 如 foo(…, ‘c’, ‘d’, …). 需
要注意的是, Python 优先赋值给顺序在前的默认参数. 例如 foo(…, ‘value’, …) 会将‘value’传递给默认参数 c, 而默
认参数 d 为默认值 0. 此外, 还可以通过键值对的形式传递部分默认参数的值. 例如 foo(…, d=‘d’, …), 此时会将‘d’
传递给默认参数 d, 而默认参数 c 为默认值 0. 这种方式使得参数传递更加灵活, 可以根据需要灵活赋值给需要提
供值的参数.
可变参数允许传递任意数量的值, 这些值在 API 内部被组装成一个元组. 例如 foo(…, 0, 1, 2, …) 调用后 args
变量的值为元组 (0, 1, 2). 需要注意的是, 当 API 定义中有可变参数时, 也可以不传递任何值给它. 例如 foo(‘a’, ‘b’,
‘c’, ‘d’, key1=1) 调用后 args 变量为长度为 0 的元组. 可变参数使得 API 可以灵活接收不确定数量的值.
命名关键字参数可以指定默认值 (如示例代码 1 中的 key2), 也可以不指定默认值 (如示例代码 1 中的 key1).
在对其传递值时, 必须以键值对的形式进行, 例如 foo(…, key1=1, key2=2, …). 注意, 对于没有默认值的命名关键
字参数, 必须提供值进行传递, 即 foo(‘a’, ‘b’, ‘c’, ‘d’) 和 foo(‘a’, ‘b’, ‘c’, ‘d’, key2=2) 会运行失败.
关键字参数允许传递任意数量的键值对, 这些键值对将在 API 内部被组装成一个字典. 例如 foo(…, key3=3,
key4=4) 调用后 kwargs 为字典{‘key3’:3, ‘key4’:4}.
1.1.2.3 灵活的返回语句使用
在 Python 语法中, 返回语句 (return) 可缺省, 在缺省情况下默认返回 None. 此外, Python 支持返回语句中包含
多个变量. 这种方式使得 API 可以灵活返回
1.2 相关工作
1.2.1 第三方库的演化
由于缺陷修复、代码重构、功能新增等, 第三方库代码会不断更新演化. 已有研究人员对此展开研究 [2,20−23] .
Zhang 等人 [2] 关注 Python 第三方库的演化, 发现 14 种与句法相关的演化规则, 覆盖第三方库的类、API 和字段.
其中, 与 API 有关的演化规则为 API 增删、必选参数增删、参数重排序、可选参数增删、参数默认值增删以及
参数默认值改变, 后 3 种是 Python 语言特有的演化规则. Zhang 等人 [20] 关注深度学习库 TensorFlow 的演化, 发现
随着版本更新, 增加的 API 逐渐增多, 删除的 API 逐渐减少, 未有 API 的名称发生改变, 而 API 移动、参数增删、
参数重命名、返回值修改等变动的数量在不断波动. Dilhara 等人 [21] 关注上层应用开发者对机器学习第三方库更