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] 关注上层应用开发者对机器学习第三方库更
   27   28   29   30   31   32   33   34   35   36   37