Page 35 - 《软件学报》2025年第4期
P. 35
沈阚 等: 基于静态分析的 Python 第三方库 API 兼容性问题检测方法 1441
败, 发现 70 个不兼容 API 对.
第三方库更新日志: 分析第三方库 v2 版本的更新日志, 若发现日志中出现“减少参数”“增加处理”“不再支持”
等关键字, 则认为对应的 API 对存在兼容性问题. 由于跨 patch 版本对并非紧密相连, 分析跨 patch 版本对时, 还会
分析 v1 至 v2 中间版本的更新日志, 但仅记录更改保留至 v2 版本的 API . 例如, 除了分析 flask 库版本 2.0.0、
2.2.0、2.1.3 的更新日志外, 还会分析版本 2.1.1、2.1.2 中保留至版本 2.1.3 的更新. 通过分析共计 11 个更新日志,
额外发现 38 个不兼容 API 对.
为提升数据的可信度, 不兼容 API 对的收集过程由本文第一作者和第二作者独立完成, 第三位作者负责解决
分歧. 具体来说, 当一个不兼容 API 对仅由一位作者收集发现时, 前三位作者开会分析此 API 对的源代码、回归
测试、更新日志, 并讨论决定此 API 是否存在兼容性问题. 同样地, 从表现形式 (RQ1) 和产生原因 (RQ2) 这两个
角度对不兼容 API 对的分类过程也根据上述过程进行验证.
2.3 实证研究的结果: Python 第三方库 API 兼容性问题的表现形式 (RQ1)
从 Python 第三方库 API 调用者的角度看, 调用不兼容 API 会造成上层应用在两个版本上的运行行为发生改
变. 通过对收集到的 108 个不兼容 API 对进行分析, 本文发现 Python 第三方库 API 兼容性问题的表现形式有
6 种, 如表 3、图 2 所示.
表 3 Python 第三方库 API 兼容性问题的表现形式
序号 兼容性问题表现形式 总计 (个) flask库不兼容API数量 (个) pandas库不兼容API数量 (个)
S1 输入参数格式错误 28 6 22
S2 非法输入参数值 43 1 42
S3 非法输入参数类型 3 1 2
S4 输出变量值错误 40 8 32
S5 输出变量类型错误 1 0 1
S6 新异常无法捕获错误 6 3 3
总计 108 17 91
注: 由于一个不兼容API在不同调用中表现形式不同, 总计数据小于各项加和
第三方库
新异常无法捕获错误 (S6)
6 个
输入参数格式错误 (S1)
输出变量类型错误 (S5)
28 个
1 个
输出变量值错误 (S4)
40 个
非法输入参数类型 (S3) 非法输入参数值 (S2)
3 个 43 个
图 2 Python API 兼容性问题的表现形式
28 个 API 的兼容性问题表现为输入参数格式错误 (S1), 即上层调用 API 的格式与第三方库中 API 的签名不
匹配. 此时, Python 默认抛出异常 TypeError.
例 1: 示例代码 2 中, 默认参数 encoding 被删除, 导致运行 cls.to_stata(‘fname’, convert_dates=‘convert _dates’,
write_index=‘write_index’, encoding=‘latin-1’, byteorder=‘byteorder’) 时抛出异常 TypeError: to_stata() got an
unexpected keyword argument ‘encoding’. 此外, 由于必选参数 fname 被重命名为 path, 上层调用 cls.to_stata
(fname=‘fname’) 时抛出异常 TypeError: to_stata() got an unexpected keyword argument ‘fname’.