Page 37 - 《软件学报》2025年第4期
P. 37
沈阚 等: 基于静态分析的 Python 第三方库 API 兼容性问题检测方法 1443
2 ...
3 – if self._current_row_in_file_index >= self.row_count:
4 + if nrows > 0 and self._current_row_in_file_index >= self.row_count:
5 – return None
6 + return DataFrame()
例 3: 示例代码 5 中, 当 ctx 为 None 时, v1 版本 pandas1.4.4 中 render_template 运行至第 5 行时会抛出异常
AttributeError, 这导致上层应用执行第 3、4 行的代码块. 然而, v2 版本 pandas1.5.0 中新增的第 3、4 行导致相同
情况下会抛出异常 RuntimeError 而非 AttributeError, 导致上层应用代码中的 except 语句无法捕获异常, 进而异常
终止.
示例代码 5. 新异常无法捕获错误 (S6).
# 版本变更: pandas1.4.4 → pandas1.5.0
1 def render_template(template_name_or_list, **context):
2 ctx = _app_ctx_stack.top
3 + if ctx is None:
4 + raise RuntimeError(‘This function can only be used when an application context is active.’)
5 ctx.app.update_template_context(context)
6 return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list), context, ctx.app)
# 受兼容性问题影响的上层应用代码
1 try:
2 render_template(template_name_or_list)
3 except AttributeError:
4 pass
API 调用者的角度看, API 兼容性问题的表现形式有
第三方库
结论: 从
种, 分别为输入参数
RQ1 CI2
Python
6
格式错误 (S1/25.93%)、非法输入参数值 (S2/39.81%)、非法输入参数类型 (S3/2.78%)、输出变量值错误
(S4/37.04%)、输出变量类型错误 (S5/0.93%) 和新异常无法捕获错误 (S6/5.56%), 它们最终会反映为上层应用的非
正常运行. 其中, 非法输入参数值 (S2) 和输出变量值错误 (S4) 占比最高.
2.4 实证研究的结果: Python 第三方库 API 兼容性问题的产生原因 (RQ2)
通过对收集到的 108 个有兼容性问题的 API 对进行分析, 本文发现 Python 第三方库 API 兼容性问题的产生
原因有 7 种, 分布如表 4、图 3 所示. 其中 CI1–CI5 与参数有关, CI6 与异常有关, CI7 与返回值有关.
表 4 Python 第三方库 API 兼容性问题的产生原因
序号 兼容性问题产生原因 总计 (个) flask库不兼容API数量 (个) pandas库不兼容API数量 (个)
CI1 参数的增删 26 5 21
关键字参数的键增删 1 0 1
CI3 参数的重命名 3 1 2
CI4 参数默认值的改变 11 2 9
CI5 参数的范围改变 45 2 43
CI6 抛出不同的异常 6 3 3
CI7 输出不同的返回值 31 7 24
总计 108 17 91
注: 由于一个API可能由多种原因导致不兼容, 总计数据小于各项加和