Page 38 - 《软件学报》2025年第4期
P. 38
1444 软件学报 2025 年第 36 卷第 4 期
参数的增删 (CI1)
输出不同的返回值 (CI7)
26 个
31 个
关键字参数的键增删 (CI2)
1 个
参数的重命名 (CI3)
抛出不同的异常 (CI6) 3 个
6 个 参数默认值的改变 (CI4)
11 个
参数的范围改变 (CI5)
45 个
图 3 Python 第三方库 API 兼容性问题的产生原因
位置参数: 因为所有位置参数都必须传入值, 所以若第三方库
从 Python 的语法来看, 第三方库 API 兼容性问题的产生原因还应该包括参数种类的改变和参数位置的改变.
参数种类的改变指从 Python 5 种参数中的任意一种变成另外一种, 如从默认参数变为位置参数. 参数位置的改变
有两种, 一种是由参数的增删 (CI1) 导致的副作用, 如示例代码 2 中参数 byteorder 的位置从 6 变为 5; 另一种是两
个参数的位置互换. 本文收集到的 108 个不兼容 API 对中未发现由参数种类改变、两个参数位置互换导致的兼容
性问题.
2.4.1 与参数有关的兼容性问题 (CI1–CI5)
26 个 API 的兼容性问题由参数的增删导致 (CI1). 参数的增删包括两个方面的内容, 一是参数的增加, 二是参
数的删除, 它们导致的兼容性问题均表现为输入参数格式错误 (S1).
(1) 参数的增加: 表 5 展示了 Python 第三方库 API 中 5 种参数的增加对兼容性的影响.
表 5 由于参数增加原因导致的 Python 第三方库 API 兼容性问题
增加该类参数是否 示例代码
参数类别
会造成兼容性问题 第三方库API代码 受兼容性问题影响的上层应用代码
- def foo(a):
a’)
位置参数 一定是 + def foo(a, b): foo(‘
pass foo(a=‘a’)
- def foo(a=0, c=2):
默认参数 可能是 + def foo(a=0, b=1, c=2): foo(‘a’, ‘c’)
pass
可变参数 否
- def foo(*, key1=1):
命名关键字参数 可能是 + def foo(*, key1=1, key2): foo( )
pass foo(key1=‘1’)
关键字参数 否
API 有新增的位置参数, 则上层应用会异常
终止.
默认参数: 当上层调用给默认参数传递值的数量小于第三方库 API 默认参数的数量时, Python 默认按照参数
定义的顺序进行赋值. 因此, 如果在新增默认参数之后还存在其他默认参数, 可能会导致值的传递发生错位. 以表 5
中的示例代码为例, 在 v1 版本中, 值‘c’将被赋给参数 c. 而在 v2 版本中, 值‘c’将被赋给参数 b, 参数 c 将使用默认
值 2.
命名关键字参数: 因为所有无默认值的命名关键字参数都必须传入值, 所以若第三方库 API 有新增的无默认
值的命名关键字参数, 则上层应用会异常终止.