Page 30 - 《软件学报》2025年第4期
P. 30
1436 软件学报 2025 年第 36 卷第 4 期
pairs of the flask and pandas libraries. Subsequently, an empirical study is conducted on the collected data, summarizing the symptoms and
causes of compatibility issues. Finally, this study proposes a static analysis-based detection method for incompatible Python APIs,
providing syntactic-level causes of incompatible API issues. This study conducts experimental evaluations on 12 version pairs of 4 popular
Python third-party libraries. The results show that the proposed method is good in effectiveness, generalization, time performance, memory
performance, and usefulness.
Key words: Python; static analysis; third-party libraries; API compatibility issues; version evolution
作为目前最受欢迎的编程语言之一, Python 以其丰富的第三方库开发生态, 受到了众多开发者的青睐. 第三方
库开发者通过对代码底层逻辑的封装, 使得上层应用开发者只需关心相应的 API 调用, 从而可以实现快速开发, 大
大提升了开发效率 [1] . 然而, Python 的第三方库会因为缺陷修复、功能新增和代码重构等原因而频繁发生更新和
迭代. 更新版本的代码中存在对已有版本 API 的变更, 这些变更可能对 API 进行不兼容更改, 从而导致调用该
API 的上层应用项目在更新第三方库版本后出现异常终止或者产生不一致的结果 [2] . 因此, 理解 Python 第三方库
API 兼容性问题, 实现相应的不兼容 API 检测方法, 可以有效避免因兼容性问题导致的错误, 保障软件正常可靠运
行. 当上层应用开发者调用 Python 第三方库的某一函数、某一类或某一类的成员函数时, 第三方库内部会形成一
在实证研究的基础上, 本文提出了一种基于静态分析技术的
个调用链, 调用链中涉及此第三方库多个文件中的函数、类以及类的成员函数. 为探求第三方库兼容性问题的细
粒度产生原因, 并实现对应的检测方法, 本文中的 API 包括第三方库源代码中的所有函数以及所有类的成员函数.
针对 Python 第三方库 API 兼容性问题, 目前相关的研究工作 [2−4] 存在一定的局限性. 在 Python 不兼容 API 的
数据收集方面, 现有研究通过分析第三方库的更新日志来获取存在兼容性问题的 API. 然而, 这种方式严重依赖于
开发者记录更新日志的质量, 往往无法搜集得到所有存在兼容性问题的 API. 在问题产生原因方面, 现有研究对
Python 第三方库 API 兼容性问题的认识还不够充分, 例如, Python 参数包含 5 种类别, 但暂未有工作系统对其中
的可变参数、命名关键字参数、关键字参数进行细粒度分析, 未有静态检测方法可以输出这些兼容性问题的细粒
度原因. 此外, 除了 Python 生态, 研究人员还对 Java、Android 等生态系统展开了研究 [5−15] . 然而, Python 作为动态
语言, 与 Java 等静态语言存在显著的区别 [16] . 例如 Python 语言的弱类型特性、方法参数可变的特性等, 导致对静
态语言第三方库 API 的兼容性问题检测方法无法直接应用到 Python 第三方库中.
为探求 Python 兼容性问题的细粒度产生原因并实现检测兼容性问题的静态方法, 本文首先采用收集版本更
新日志与运行回归测试相结合的方法来构建 Python 第三方库不兼容 API 的数据集, 从而弥补文献 [2,3] 因更新日
志记录不完整导致的不兼容 API 数据集不全的问题. 最终, 本文在 flask 库 [17] 和 pandas 库 [18] 的 6 个版本对共收集
到 108 个不兼容 API 对. 其中, 70 个 (64.8%) 不兼容 API 对通过运行回归测试收集, 其余 38 个 (35.2%) 不兼容 API
对通过阅读版本更新日志进行补充. 然后, 本文对 Python 第三方库 API 兼容性问题进行了实证研究, 通过分析
108 个不兼容 API 对, 总结了 API 兼容性问题的表现形式和产生原因. 表现形式是从第三方库调用者的角度进行
分析, 而产生原因是从第三方库开发者的角度进行分析. 为提升数据的可信度, 收集不兼容 API 对以及根据表现形
式和产生原因分类不兼容 API 对均由本文第一作者和第二作者完成. 当出现分歧时, 由本文第三作者组织小组讨
论, 并决定最终结果. 与文献 [2,3] 不同的是, 本文增加了对 API 兼容性问题表现形式的分析, 同时在分析产生原因
时增加了与异常有关的兼容性问题, 并对 Python 的 5 种参数进行了逐一分析.
Python 第三方库 API 兼容性问题检测方法. 方法
的输入为 Python 第三方库在更新前后两个版本的源代码, 通过语句级别的数据流、控制流切片分析, 最终输出为
句法层面的兼容性问题产生原因集合.
最后, 本文在 flask 库等 4 个常用 Python 第三方库的共计 12 个版本对上进行了实验评估. 评估结果证明本文
方法具有较好的有效性、泛化性、时间性能、空间性能以及易用性. 在有效性上, 方法的精准率和召回率分别达到
了 92.87% 和 93.79%. 在新构建的数据集上, 精准率和召回率分别为 88.65% 和 94.59%, 这表明方法具有良好的泛
化性. 在时间性能和空间性能上, 检测这 12 个版本对的 5 243 个变更 API 共耗时 30 858.09 s, 共占用内存 1 494.24
MB, 平均每个版本对的检测大约需要耗时 42.86 min、占用 124.52 MB 的内存. 此外, 本文邀请了 10 名有经验的
Python 开发者在不兼容 API 上进行人工实验, 结果表明本文方法有良好的易用性.